“没有模板参数使用”

时间:2012-04-21 21:05:59

标签: c++ class templates

我之前已经意识到类似的问题,但是我读过其中几个,但仍然没有看到我出错的地方。当我只是编写我的类而不将原型与定义分开时,一切正常。当我将原型和定义分开时,问题就出现了,如下所示:

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();

我以前从未做过模板课,所以如果这里的问题很简单,请原谅我。

5 个答案:

答案 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;
};

在这种情况下,ExampleExample<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