【问题标题】:"used without template parameters"“在没有模板参数的情况下使用”
【发布时间】:2026-01-03 12:25:01
【问题描述】:

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

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

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

【问题讨论】:

  • 注意:在大多数情况下,您希望在标头中访问模板成员函数的定义。如果定义在标题中,请记住将它们标记为inline(或在模板类定义中定义它们),如果不是,请三思而后行并确保您不需要标题中的定义(您需要如果您在包含要使用模板的 all 类型的定义的翻译单元中显式实例化,则不需要标题中的定义)。我担心你很快就会被这个咬住......

标签: c++ class templates


【解决方案1】:

VisitedSet 是一个模板,而不是一个类,所以你不能在嵌套的名称说明符中使用VisitedSet,例如VisitedSet::getSize()。正如您为所有class T 指定class VisitedSet&lt;T&gt; 的声明一样,您必须为所有class T 指定VisitedSet&lt;T&gt;::getSize() 的定义:

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

但是,模板的名称可以被用作模板定义中的类

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

在这种情况下,ExampleExample&lt;T&gt; 的缩写。

【讨论】:

    【解决方案2】:

    你想要这个:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          试试看

          template <typename T>
          

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

          【讨论】:

          • 当我将template&lt;class T&gt; 放在int VisitedSet::getSize() { 的正上方时,我得到了完全相同的错误。我是否希望将原型与定义分开?这就是在这种情况下内联的意思吗?
          • @synaptic 您还需要在课堂上使用模板参数,正如我在其他答案中所建议的那样。
          最近更新 更多