模板只使用内联定义

时间:2013-06-04 11:11:45

标签: c++ class templates

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

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

Class只有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 ++初学者,我已经神经衰弱了,因为我已经花了很长时间才能让程序运行。

希望有人能帮助我

谢谢和问候

乌韦

2 个答案:

答案 0 :(得分:1)

在main函数中,在创建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));
};

答案 1 :(得分:1)

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

您需要在主要的Test<int> TestObjekt(0);

中为构造函数调用添加参数

或者,或者,定义一个不需要值Test(){ \\do something }

的构造函数

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

请参阅this答案,了解标题中为何需要定义的详细解释。