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

eblbsuwk  于 2023-08-09  发布在  其他
关注(0)|答案(6)|浏览(118)

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

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

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

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


  • 谢谢-谢谢
1bqhqjot

1bqhqjot1#

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

template class<typename T>
void MyClass<T>::myMethod()
{
    // Method Body
}

字符串
原因是该方法实际上依赖于模板参数。请记住,每个方法都可以访问特殊变量this;在方法调用期间,this实际上是传递给方法的参数。this的类型根据对象示例化期间指定的模板参数而变化,因此,所有方法都必须是模板方法,以适应所有形式的this

6kkfgxo0

6kkfgxo02#

如果方法不依赖于模板参数,那么只能使用继承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;
}

字符串

v8wbuo2f

v8wbuo2f3#

把它放在头文件中。
成员函数仍然是类模板的成员,你必须这样写:

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

字符串
与所有模板成员函数一样,这实际上还不是一个真实的的函数;它只在类模板被示例化时 * 生成 * 一个真实的的函数。因此,完整的模板定义必须对每个示例化模板的人都可见,通常的方法是将所有内容都放在头文件中。
(Note类模板的成员函数本身也被认为是函数模板,你实际上可以专门化它们:template <> void MyClass<int>::myMethod() { } .)

2hh7jdfx

2hh7jdfx4#

你需要这样做:

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

字符串
模板化的不是方法,而是类。
你可以在一个非模板化的类中有一个模板化的方法,在一个模板化的类中有一个非模板化的方法(你的例子),在一个模板化的类中有一个模板化的方法,当然在一个非模板化的类中有一个非模板化的方法。

2uluyalo

2uluyalo5#

你必须用另一种方式来定义它。方法本身可能不(直接)依赖于模板参数,但它所属的类肯定依赖于模板参数,不是吗?因此,该方法也间接依赖于模板参数:

template class<typename T>
void MyClass<T>::myMethod()
{  //       ^^^ -- note
   ...
}

字符串

wfsdck30

wfsdck306#

我看了5个答案,只有维利斯的答案不是垃圾。为什么每个人都重复同样的垃圾答案。在StackOverflow中重复不是非法的吗?
每个人都说记住类是模板化的。这个场景很清楚,这个函数不依赖于任何模板。
因此,我将通过添加询问问题的人想要的解决方案来实现正义。我们将声明一个静态方法。很简单!

struct JavaObject
{
 jobject m_obj;
};

template <class T>
struct JavaObjectArray : JavaObject
{
 public:
    T getObject(int i) { return (T)JavaObjectArray<void>::getObject__(m_obj,i); }

 private:
    static JavaObject getObject__(jobject,int i);
};

字符串
然后...

JavaVM *vm; // pretend is valid
JNI *env; // pretend is valid

template<>
JavaObject JavaObjectArray<void>(jobject obj,int i)
{
 return env->GetObjectArrayElement(obj,i);
}

相关问题