0

当我的模板类被内联定义时,以下代码可以正常工作:

main
{
   unsigned int A=0;                       //local variable in  'main'.
   Test<int>  TestObjekt;   //Object.
   //do something
   cout<<TestObjekt.calculate_a(A);
};

该类刚刚创建了 4 个测试原因,它在给定数据“a”中添加了一个“2”,并将结果返回 main 的局部变量“A”:

template <typename T> class Test        //dichiarazione classe
{
private: 
     T a;      //private variable of changeable type T.

public:               
  Test(T InitA)     //constructor
  {
     a=InitA;
  }

  T calculate_a(T a)  //method
  {
     a+=2;
     return a;
  }
};

这样,一切正常,但是当我对类进行大纲定义时,编译器不再接受它。这是声明:

template <typename T> class Test        //class declaration
{
private: 
  T a;      //private variable

public:               
  Test(T InitA);  //constructor
  T calculate_a(T);  //method
};

现在我的定义:

template <typename T>  Test<T>::Test(T InitA)
{
   a=InitA;
}

template <typename T> T Test<T>::calculate_a(T)  //metodo della classe Test
{
   a+=2;
   return a;
}

错误消息如下:

1.error C2512: 'Test<T>': non è disponibile alcun costruttore predefinito...  
  means: there is no appropriate, predefined constructor available

1>        with
1>        [
1>            T=int
1>        ]

我正在使用 Visual C++ 2008 Express 版本编译器。我是一个 C++ 初学者,我几乎精神崩溃了,因为我已经为使程序运行而奋斗了很长时间。

希望有人可以帮助我

谢谢并恭祝安康

乌韦

4

2 回答 2

1

在创建 Test 对象的主函数中,向构造函数添加一个值(使用 init-value 创建 TestObject):

Test<int>  TestObjekt(0);   // Object with init value

或者创建一个不需要值的构造函数,例如在你的类声明中为构造函数的原型添加一个默认值:

Test(T InitA= 0);  //constructor with default value

完整版本:

template <typename T> class Test        //class declaration
{
    private: T a;      //private variable

    public:               
        Test(T InitA= 0);  // <<<-- either change here
        T calculate_a(T);  //method
};

或更改主要:

void main()
{
    unsigned int A=0;             //local variable in  'main'.

    Test<int>  TestObjekt(0);   // <<<--- change here.

    //do something
    printf("%d", TestObjekt.calculate_a(A));
};
于 2013-06-04T11:17:26.110 回答
1

该行Test<int> TestObjekt;隐式调用Test<int>()不存在的默认构造函数。

您要么需要在 main 中的构造函数调用中添加参数:Test<int> TestObjekt(0);

或者,或者,定义一个不需要值的构造函数Test(){ \\do something }


模板定义也必须在头文件中。

请参阅答案以很好地解释为什么标题中需要定义。

于 2013-06-04T11:19:15.877 回答