簡體   English   中英

實現在模板類中定義的非模板方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM