2012-04-21 88 views
16

我意识到类似的问题之前已经被问到过,但是我阅读了其中的一些,但仍然没有看到我要出错的地方。当我简单地写我的类而不将原型与定义分开时,一切正常。”没有使用模板参数“

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

注意:在大多数情况下,您希望头中可以访问模板成员函数的定义。如果定义在标题中,请记住将它们标记为“inline”(或者在模板类定义中定义它们),如果它们不是,请仔细考虑并确保不需要标题中的定义(您可以如果在包含要使用该模板的* all *类型的定义的翻译单元中显式实例化,则不需要头中的定义)。我担心你很快会得到这个... – 2012-04-21 21:50:25

回答

28

VisitedSet是一个模板,而不是一类,所以你不能在嵌套名指定中使用这样的VisitedSetVisitedSet::getSize()。正如您所指定的class VisitedSet<T>声明所有class T,你必须指定所有class T的的VisitedSet<T>::getSize()定义:

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

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

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

在这种情况下,Example是短期的Example<T>

0

尝试把

template <typename T> 

VisitedSet实施上述::的getSize() - 但要注意的是,在一般情况下,模板类和函数都应该被内联。有关更多信息,请参阅C++ faq here

+0

当我把'template '直接放在'int VisitedSet :: getSize(){'这一行的上面时,我会得到完全相同的错误。我最好是不要将原型与定义分开?在这种情况下,内联是什么意思? – synaptik 2012-04-21 21:12:54

+0

@synaptic在其他答案中,您还需要使用类中的模板参数。 – 2012-04-21 21:13:56

3

你想这样的:

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

您必须声明模板参数的定义以及

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

否则编译器不能与之相匹配的声明。例如,某些参数类型可能存在专门化。

+0

我明白了。感谢大家。 – synaptik 2012-04-21 21:13:57

2

你需要让你的编译器知道你是在实现模板函数的方法:

template<typename T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
相关问题