当我想定义在模板类中声明的方法,但该方法不依赖于模板参数时,我是否可以在包含文件中将其定义为:
template class<typename T>
void MyClass::myMethod()
{
...
}
或者我可以在cpp文件中将其定义为:
void MyClass::myMethod()
{
...
}
感谢。
答案 0 :(得分:9)
您需要像这样定义您的方法:
template class<typename T>
void MyClass<T>::myMethod()
{
// Method Body
}
原因是该方法实际上取决于模板参数。请记住,每个方法都可以访问特殊变量this
;在方法调用期间,this
实际上是传递给方法的参数。 this
类型的更改取决于在对象实例化期间指定的模板参数,因此,所有方法都必须是模板方法,以适应所有形式的this
。
答案 1 :(得分:5)
好吧,如果方法不依赖于模板参数,那么只能通过继承AFAIK来实现。
缺点:更多代码+继承
好处:(很多)生成的代码较少,具体取决于代码的哪些部分实际上取决于模板。在下面的示例中,方法NonDependentMethod
只生成一个程序集,而DependentMethod
将生成尽可能多的模板参数(在这种情况下只有一个,但是生成MyClass<float>
并且您有二,等等。
#include <iostream>
using namespace std;
class MyClassBase
{
public:
void NonDependentMethod();
};
template <class T> class MyClass : public MyClassBase
{
public:
void DependentMethod(T param);
};
void MyClassBase::NonDependentMethod()
{
cout << "NonDependentMethod << endl;
}
template<class T> void MyClass<T>::DependentMethod(T param)
{
cout << "DependentMethod " << param << endl;
}
int main() {
// your code goes here
MyClass<int> cls;
cls.NonDependentMethod();
cls.DependentMethod(2);
return 0;
}
答案 2 :(得分:4)
将它放在头文件中。
成员函数仍然是类模板的成员,您必须编写:
template <typename T> void MyClass<T>::myMethod() { /* ... */ }
与所有模板成员函数一样,这实际上并不是真正的函数;只有在实例化类模板时生成实际函数。因此,实例化模板的每个人都必须能够看到完整的模板定义,通常的方法是将所有内容放在标题中。
(请注意,类模板的成员函数本身被视为函数模板,您实际上可以对它们进行特化:template <> void MyClass<int>::myMethod() { }
。)
答案 3 :(得分:1)
你需要这样做:
template class<typename T>
void MyClass<T>::myMethod()
{
...
}
这不是模板化的方法,而是类。
您可以在非模板化类中使用模板化方法,在模板化类(您的案例中)中使用非模板化方法,在模板化类中使用模板化方法,当然还可以在非模板化类中使用非模板化方法模板类。
答案 4 :(得分:0)
您必须以其他方式定义它。方法本身可能不会(直接)依赖于模板参数,但它所属的类是什么,不是吗?因此,该方法也间接依赖于模板参数:
template class<typename T>
void MyClass<T>::myMethod()
{ // ^^^ -- note
...
}