【问题标题】:Template Compiles in Header but not in Implementation [duplicate]模板在标题中编译但不在实现中[重复]
【发布时间】:2013-09-12 12:41:44
【问题描述】:

我正在用 C++ 实现一个红黑树,并希望对任何类型的输入使用模板类。这是我在标题中的内容:

template <class T>
class RBtree{
public:
    RBtree();
    ~RBtree();
    //...
private:
    //...
};

在.cpp文件中:

RBtree::RBtree(){
    //...
}
//...

当我尝试在 Xcode 中编译时,我得到一个“期望一个类或命名空间”的错误,但构造函数不是已经在头文件中定义了吗?我的 .cpp 文件中的所有方法实现也会出错。

编辑:Yochai 在下面的回答是正确的。

【问题讨论】:

标签: c++ templates red-black-tree


【解决方案1】:

首先,模板类的函数实现必须对任何使用它的代码“可见”。
所以你应该在头文件中实现模板类。

其次,正确的语法是:

template <class T>
RBtree<T>::RBtree(){
//...
}
//...

【讨论】:

  • 这是正确答案。谢谢!
【解决方案2】:

编译器必须知道每个类型 T 的实例化模板类的实现。您可以将所有代码放入 .hpp 或包含 .hpp 中的 .cpp。还有其他单独编译的技术。

【讨论】:

    【解决方案3】:

    试试

    template <class T>
    RBtree<T>::RBtree(){ ... }
    

    所有其他功能的布局相同。如果您仍然得到未定义的引用,则将您的函数放入 .h 以便编译器可以找到它们。

    【讨论】:

      【解决方案4】:

      这是模板的常见问题。尝试将您的实现移动到头文件中或在定义时实现该功能。这将解决您的问题。

      更多详情请通过:Why templates needs to be implemented only in the header file?

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多