当我想定义一个在模板类中声明的方法,但该方法不依赖于模板参数时,我必须在包含文件中将其定义为:
template class<typename T> void MyClass::myMethod() { ... }
字符串或者我可以在cpp文件中将其定义为:
void MyClass::myMethod() { ... }
型?
1bqhqjot1#
你需要像这样定义你的方法:
template class<typename T> void MyClass<T>::myMethod() { // Method Body }
字符串原因是该方法实际上依赖于模板参数。请记住,每个方法都可以访问特殊变量this;在方法调用期间,this实际上是传递给方法的参数。this的类型根据对象示例化期间指定的模板参数而变化,因此,所有方法都必须是模板方法,以适应所有形式的this。
this
6kkfgxo02#
如果方法不依赖于模板参数,那么只能使用继承AFAIK。缺点:更多代码+继承好处:生成的代码(少得多),这取决于代码的哪些部分实际上是依赖于模板的。在下面的例子中,方法NonDependentMethod只会生成一个程序集,而DependentMethod会生成与不同模板参数一样多的程序集(在本例中只有一个,但如果生成一个MyClass<float>,则有两个,等等)。
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; }
字符串
v8wbuo2f3#
把它放在头文件中。成员函数仍然是类模板的成员,你必须这样写:
template <typename T> void MyClass<T>::myMethod() { /* ... */ }
字符串与所有模板成员函数一样,这实际上还不是一个真实的的函数;它只在类模板被示例化时 * 生成 * 一个真实的的函数。因此,完整的模板定义必须对每个示例化模板的人都可见,通常的方法是将所有内容都放在头文件中。(Note类模板的成员函数本身也被认为是函数模板,你实际上可以专门化它们:template <> void MyClass<int>::myMethod() { } .)
template <> void MyClass<int>::myMethod() { }
2hh7jdfx4#
你需要这样做:
template class<typename T> void MyClass<T>::myMethod() { ... }
字符串模板化的不是方法,而是类。你可以在一个非模板化的类中有一个模板化的方法,在一个模板化的类中有一个非模板化的方法(你的例子),在一个模板化的类中有一个模板化的方法,当然在一个非模板化的类中有一个非模板化的方法。
2uluyalo5#
你必须用另一种方式来定义它。方法本身可能不(直接)依赖于模板参数,但它所属的类肯定依赖于模板参数,不是吗?因此,该方法也间接依赖于模板参数:
template class<typename T> void MyClass<T>::myMethod() { // ^^^ -- note ... }
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); }
型
6条答案
按热度按时间1bqhqjot1#
你需要像这样定义你的方法:
字符串
原因是该方法实际上依赖于模板参数。请记住,每个方法都可以访问特殊变量
this
;在方法调用期间,this
实际上是传递给方法的参数。this
的类型根据对象示例化期间指定的模板参数而变化,因此,所有方法都必须是模板方法,以适应所有形式的this
。6kkfgxo02#
如果方法不依赖于模板参数,那么只能使用继承AFAIK。
缺点:更多代码+继承
好处:生成的代码(少得多),这取决于代码的哪些部分实际上是依赖于模板的。在下面的例子中,方法
NonDependentMethod
只会生成一个程序集,而DependentMethod
会生成与不同模板参数一样多的程序集(在本例中只有一个,但如果生成一个MyClass<float>
,则有两个,等等)。字符串
v8wbuo2f3#
把它放在头文件中。
成员函数仍然是类模板的成员,你必须这样写:
字符串
与所有模板成员函数一样,这实际上还不是一个真实的的函数;它只在类模板被示例化时 * 生成 * 一个真实的的函数。因此,完整的模板定义必须对每个示例化模板的人都可见,通常的方法是将所有内容都放在头文件中。
(Note类模板的成员函数本身也被认为是函数模板,你实际上可以专门化它们:
template <> void MyClass<int>::myMethod() { }
.)2hh7jdfx4#
你需要这样做:
字符串
模板化的不是方法,而是类。
你可以在一个非模板化的类中有一个模板化的方法,在一个模板化的类中有一个非模板化的方法(你的例子),在一个模板化的类中有一个模板化的方法,当然在一个非模板化的类中有一个非模板化的方法。
2uluyalo5#
你必须用另一种方式来定义它。方法本身可能不(直接)依赖于模板参数,但它所属的类肯定依赖于模板参数,不是吗?因此,该方法也间接依赖于模板参数:
字符串
wfsdck306#
我看了5个答案,只有维利斯的答案不是垃圾。为什么每个人都重复同样的垃圾答案。在StackOverflow中重复不是非法的吗?
每个人都说记住类是模板化的。这个场景很清楚,这个函数不依赖于任何模板。
因此,我将通过添加询问问题的人想要的解决方案来实现正义。我们将声明一个静态方法。很简单!
字符串
然后...
型