首页 文章

将Windows代码移植到Mac

提问于
浏览
0

我正在将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

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

  • /Users/yingyhe/Projects/SASCode/SASPRLib/PriorityQueue.h:13:53:未知类型名称'priority_queue';你的意思是'PriorityQueue'?

  • /Users/yingyhe/Projects/SASCode/SASPRLib/PriorityQueue.h:13:68:重新定义'pq'

似乎这个头文件包含了多次,但我使用了#ifndef - #define - #endif来避免这种情况 .

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

2 回答

  • 1

    你忘了 std:: 前缀 .

    我怀疑你通常将这个文件包含在你收录之前的所有地方 .

    但是还有更多的问题 .

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

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

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

    您得到重定义错误,因为您声明了一个与参数同名的局部变量 .

    在函数体中,

    std::priority_queue(pq);
    

    相当于

    std::priority_queue pq;
    

    这遵循“如果它可以是声明,它是声明”规则 .

    如果没有其他文件包含 Headers ,则根本不会编译它,这就是为什么它在这种情况下有效 .
    对于包含在其中的每个源文件,它将被编译一次,这是预期的 - 防止翻译单元中的多个包含,并且每个翻译单元被单独编译 .

  • 0

    我将第13行更改为:

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

    它通过了编译

相关问题