簡體   English   中英

模板類中的函數定義

[英]Function definition in a template class

通常,在頭文件中聲明成員函數並使用源文件來實現它。 我理解的原因是函數實現只駐留在一個轉換單元中,並且只鏈接到其他單元(沒有重復的代碼),它還允許分離接口和實現,並且不需要轉發聲明函數相互依賴。

但是,模板中的成員函數取決於模板參數,如果將實現放在源文件中,則無法知道。 但是,仍然可以在類之外定義這樣的函數,但它的主要參數不再適用。

那么哪個更好?

template <class T>
class A
{
    T m()
    {
        return T();
    }
};

要么

template <class T>
class A
{
    T m();
};

template <class T>
T A::m()
{
    return T();
}

如果它是inline TA::m() ,那么這兩段代碼將是等價的,但沒有它會有什么區別嗎? 如果功能是虛擬的怎么辦? 它只是編碼風格的問題,還是有不同的語義? 如果函數足夠大,它是否會阻止重復的代碼,或者編譯器是否足夠聰明,如果它不會帶來任何好處,不會內聯它?

如果它是inline TA::m() ,那么這兩段代碼將是等價的,但沒有它會有什么區別嗎?

對於模板,成員函數隱式inline ,用於類定義的內部和外部。

如果功能是虛擬的怎么辦?

沒有區別。

它只是編碼風格的問題,還是有不同的語義?

大多是風格。 但是,它會影響名稱查找的工作方式。 所以,如果我們稍微修改類定義

template <class T>
class A
{
    using foo = T;
    foo m();
}; 

我們無法將外部成員定義為

template <class T>
foo A<T>::m()
{
    return T();
}

由於foo的查找不會發生在類定義中,直到資格A<T>:: 我們需要完全限定foo本身,就像typename A<T>::foo 或者也許使用尾隨返回類型。

如果函數足夠大,它是否會阻止重復的代碼,或者編譯器是否足夠聰明,如果它不會帶來任何好處,不會內聯它?

這兩種風格都不應該對它產生負面影響。 兩者都受到實施質量問題的影響。 但是,當然,不同的實現可能具有不同的質量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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