将Windows代码移植到Mac

时间:2015-06-05 13:39:15

标签: c++ compiler-errors osx-yosemite

我正在将C ++代码从Windows迁移到Mac。 我选择使用C ++语言的OS X命令行工具。

以下是代码段:

    #ifndef __PRIORITYQUEUE_H__
    #define __PRIORITYQUEUE_H__
    #include <queue>

    template <typename T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type>>
    class PriorityQueue : public std::priority_queue<T, Container, Compare>
    {
    public:
        PriorityQueue() {}
        PriorityQueue(const PriorityQueue& pq) {priority_queue(pq);}   // line:13
        explicit PriorityQueue(const Compare& compare) {priority_queue(compare);}
        PriorityQueue(const Compare& compare, const Container& container) {priority_queue(compare, container);}
        template<class Iter> PriorityQueue(Iter first, Iter last) {priority_queue(first, last);}
        template<class Iter> PriorityQueue(Iter first, Iter last, const Compare& compare) {priority_queue(first, last, compare);}
        template<class Iter> PriorityQueue(Iter first, Iter last, const Compare& compare, const Container& container) {priority_queue(first, last, compare, container);}
    ......
    #endif

还有其他文件将包含此头文件。 编译时,会发生以下错误:

  1. /Users/yingyhe/Projects/SASCode/SASPRLib/PriorityQueue.h:13:53:未知类型名称'priority_queue';你的意思是'PriorityQueue'吗?
  2. /Users/yingyhe/Projects/SASCode/SASPRLib/PriorityQueue.h:13:68:重新定义'pq'
  3. 这个头文件似乎多次被包含,但我使用了#ifndef - #define - #endif来避免这种情况。

    然后我把这个头文件带到一个新项目,没有其他文件包含它,它可以成功编译。这是有线的,任何人都可以告诉我为什么? 非常感谢!!!

2 个答案:

答案 0 :(得分:1)

您忘记了std::前缀。

我怀疑您通常会在收录之前将此文件包含在using namespace std;之内。

但还有更多问题。

首先,标准库容器不能用作基类 不要这样做。

基类在初始化列表中初始化,而不是在构造函数体中初始化,例如在爪哇:

PriorityQueue(const PriorityQueue& pq) : std::priority_queue(pq) {} 

您会收到重新定义错误,因为您正在声明一个与参数同名的局部变量。

在函数体中,

std::priority_queue(pq);

相当于

std::priority_queue pq;

这是在&#34;如果它可以是一个声明,它是一个声明&#34;规则。

如果没有其他文件包含标题,则根本不会编译,这就是为什么它在这种情况下有效。
它将被包含在每个源文件中一次编译,这是预期的 - &#34;包括警卫&#34;防止翻译单元中的多个内容,并且每个翻译单元都是单独编译的。

答案 1 :(得分:0)

我将第13行更改为:

`PriorityQueue(const PriorityQueue& pq) : priority_queue<T, Container, Compare>(pq) {}`

并且它通过了编译