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

时间:2011-12-09 13:36:34

标签: c++ templates

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

template class<typename T>
void MyClass::myMethod()
{
   ...
}

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

void MyClass::myMethod()
{
   ...
}

感谢。

5 个答案:

答案 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
   ...
}