模板在标头中编译但不在实现中编译

时间:2013-09-12 12:41:44

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

我在C ++中实现了一个Red-Black树,并希望对任何类型的输入使用模板化的类。这就是我在标题中的内容:

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

在.cpp文件中:

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

当我尝试在Xcode中编译时,我收到“Expected a class or namespace”的错误,但是不是已在头文件中定义的构造函数?我的.cpp文件中的所有方法实现也会出错。

编辑:Yochai的回答是正确的。

4 个答案:

答案 0 :(得分:2)

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

其次,正确的语法是:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试

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

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

答案 3 :(得分:0)

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

有关详细信息,请访问:Why templates needs to be implemented only in the header file?