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