[英]Implementing a non template method defined in a template class
當我想定義在模板類中聲明的方法,但該方法不依賴於模板參數時,我必須在包含文件中將其定義為:
template class<typename T>
void MyClass::myMethod()
{
...
}
或者我可以在 cpp 文件中將它定義為:
void MyClass::myMethod()
{
...
}
?
謝謝。
你需要像這樣定義你的方法:
template class<typename T>
void MyClass<T>::myMethod()
{
// Method Body
}
這樣做的原因是該方法實際上依賴於模板參數。 請記住,每個方法都可以訪問特殊變量this
; 在方法調用期間, this
實際上是傳遞給方法的參數。 this
的類型根據對象實例化期間指定的模板參數而變化,因此,所有方法都必須是模板方法以適應this
所有形式。
好吧,如果該方法不依賴於模板參數,則只能通過繼承 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;
}
把它放在頭文件中。
成員函數仍然是類模板的成員,您必須編寫:
template <typename T> void MyClass<T>::myMethod() { /* ... */ }
與所有模板成員函數一樣,這實際上還不是一個真正的函數; 它只在類模板被實例化時生成一個真正的函數。 因此,所有實例化模板的人都必須可以看到完整的模板定義,通常的做法是將所有內容都放在標題中。
(請注意,類模板的成員函數本身被認為是函數模板,您實際上可以專門化它們: template <> void MyClass<int>::myMethod() { }
。)
你需要這樣做:
template class<typename T>
void MyClass<T>::myMethod()
{
...
}
模板化的不是方法,而是類。
您可以在非模板化類中使用模板化方法,在模板化類中使用非模板化方法(您的情況),在模板化類中使用模板化方法,當然,在非模板化類中使用非模板化方法。
你必須以另一種方式定義它。 方法本身可能不(直接)依賴於模板參數,但它所屬的類確實如此,不是嗎? 因此,該方法也間接依賴於模板參數:
template class<typename T>
void MyClass<T>::myMethod()
{ // ^^^ -- note
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.