我正在将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
还有其他文件将包含此头文件。 编译时,会发生以下错误:
这个头文件似乎多次被包含,但我使用了#ifndef - #define - #endif来避免这种情况。
然后我把这个头文件带到一个新项目,没有其他文件包含它,它可以成功编译。这是有线的,任何人都可以告诉我为什么? 非常感谢!!!
答案 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) {}`
并且它通过了编译