我之前已经意识到类似的问题,但是我读过其中几个,但仍然没有看到我出错的地方。当我只是编写我的类而不将原型与定义分开时,一切正常。当我将原型和定义分开时,问题就出现了,如下所示:
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();
我以前从未做过模板课,所以如果这里的问题很简单,请原谅我。
答案 0 :(得分:38)
VisitedSet
是一个模板,而不是一个类,因此您不能在VisitedSet
等嵌套名称说明符中使用VisitedSet::getSize()
。就像您为所有class VisitedSet<T>
指定class T
声明一样,您必须为所有VisitedSet<T>::getSize()
指定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>
的缩写。
答案 1 :(得分:3)
你想要这个:
template <class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
答案 2 :(得分:2)
您还必须在定义中说明模板参数
template<class T>
int VisitedSet<T>::getSize() {
return vec.size();
}
否则编译器无法将其与声明匹配。例如,某些参数类型可能有专门化。
答案 3 :(得分:2)
您需要让编译器知道您正在模板函数中实现一个方法:
template<typename T>
int VisitedSet<T>::getSize() {
return vec.size();
}
答案 4 :(得分:0)
尝试放
template <typename T>
在VisitedSet :: getSize()的实现之上 - 但要注意,通常,模板化的类和函数都应该内联。有关详细信息,请参阅c ++ faq here。