0

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

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

在 .cpp 文件中:

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

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

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

4

4 回答 4

2

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

其次,正确的语法是:

template <class T>
RBtree<T>::RBtree(){
//...
}
//...
于 2013-09-12T12:45:00.330 回答
0

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

更多细节请看:为什么模板只需要在头文件中实现?

于 2013-09-12T12:57:23.770 回答
0

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

于 2013-09-12T12:45:38.333 回答
0

尝试

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

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

于 2013-09-12T12:45:58.453 回答