34

我意识到以前有人问过类似的问题,但我读了其中的几个,但仍然看不出我哪里出错了。当我简单地编写我的类而不将原型与定义分开时,一切正常。当我将原型和定义分开时会出现问题,如下所示:

template<class T> class VisitedSet { 
public:
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private:
    vector<T> vec;
    int iteration;
};

作为给我这个错误的定义的一个例子:

int VisitedSet::getSize() {
    return vec.size();

我以前从未做过模板类,所以如果这里的问题是微不足道的,请原谅我。

4

5 回答 5

51

VisitedSet是模板,而不是类,因此您不能VisitedSet在嵌套名称说明符中使用,例如VisitedSet::getSize(). 正如您指定class VisitedSet<T>for all的声明一样class T,您必须指定VisitedSet<T>::getSize()for all的定义class T

template<class T>
int VisitedSet<T>::getSize() {
//            ^^^
    return vec.size();
}

但是,模板的名称可以像模板定义中的类一样使用:

template<class T>
struct Example {
    Example* parent;
    T x, y;
};

在这种情况下,Example是 的缩写Example<T>

于 2012-04-21T21:25:26.357 回答
3

你要这个:

template <class T>
int VisitedSet<T>::getSize() {
    return vec.size();
}
于 2012-04-21T21:10:43.590 回答
2

您还必须在定义中声明模板参数

template<class T>
int VisitedSet<T>::getSize() {
    return vec.size();
}

否则编译器无法将其与声明匹配。例如,某些参数类型可能有特化。

于 2012-04-21T21:10:55.823 回答
2

您需要让编译器知道您正在模板函数中实现一个方法:

 template<typename T>
 int VisitedSet<T>::getSize() {
    return vec.size();
 }
于 2012-04-21T21:11:05.447 回答
0

试着放

template <typename T>

在 VisitedSet::getSize() 的实现之上——但要注意,一般来说,模板化的类和函数都应该被内联。有关更多信息,请参阅此处的 c++ 常见问题解答。

于 2012-04-21T21:09:44.590 回答