实现模板类中定义的非模板方法

Ood*_*ini 11 c++ templates

当我想定义在模板类中声明的方法,但该方法不依赖于模板参数时,我是否要在包含文件中将其定义为:

template class<typename T>
void MyClass::myMethod()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

或者我可以在cpp文件中将其定义为:

void MyClass::myMethod()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

wrr*_*ren 9

你需要像这样定义你的方法:

template class<typename T>
void MyClass<T>::myMethod()
{
    // Method Body
}
Run Code Online (Sandbox Code Playgroud)

原因是该方法实际上取决于模板参数.请记住,每个方法都可以访问特殊变量this; 在方法调用期间this实际上是传递给方法的参数.this类型的更改取决于在对象实例化期间指定的模板参数,因此,所有方法必须是模板方法才能适应所有形式this.


vel*_*lis 6

好吧,如果该方法不依赖于模板参数,则只能使用继承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;
}
Run Code Online (Sandbox Code Playgroud)


Ker*_* SB 4

将其放入头文件中。

成员函数仍然是类模板的成员,您必须编写:

template <typename T> void MyClass<T>::myMethod() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

与所有模板成员函数一样,这实际上还不是一个真正的函数;它仅在实例化类模板时生成真正的函数。因此,完整的模板定义必须对实例化模板的每个人都可见,通常的方法是将所有内容都放在标头中。

(请注意,类模板的成员函数本身被视为函数模板,您实际上可以对它们进行专门化:template <> void MyClass<int>::myMethod() { }。)