当我的模板类内联定义时,以下代码可以正常工作:
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 ++初学者,我已经神经衰弱了,因为我已经花了很长时间才能让程序运行。
希望有人能帮助我
谢谢和问候
乌韦
答案 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答案,了解标题中为何需要定义的详细解释。