![](/img/trans.png)
[英]What is correct way to initialize a static member of type 'T &' in a templated class?
[英]How to initialize a static const member of type depending on T in a templated class?
鑒於以下課程
template <class T>
class A {
static const B<T> member;
};
如何單獨為每個類A<T>
實例化member
?
簡單。 和其他任何靜態非整數類型一樣。
template <class T>
class A {
static const B<T> member;
};
template <class T>
const B<T> A<T>::member/*(optional-args)*/;
要為不同類型的T
分配成員,必須使用模板專門化 。
要啟動模板特化,您必須使用以下語法:
template<>
// ... explicit definition
顯式定義的語法基本上與以下語法相同:
template <class T>
const B<T> A<T>::member/*(optional-args)*/;
除了template <class T>
,您使用template<>
,而在T
中,您可以使用實際類型。
例如:
template<>
const B<type> A<type>::member(args);
注意:如果您希望在此方案中調用具有模板特化的默認構造函數,請參閱下面的編輯。
您可以將type
替換為您希望的任何類型。 有了這個,您可以為每種可能的類型提供不同的參數。 雖然如果你太專注,你應該考慮你的設計是否真的適合使用模板。
在這里它是在行動(在線),隨意克隆和玩它。
我想我會提到聲明必須是模板類所在的位置。 換句話說,如果在標頭中聲明了A
,則還必須在頭文件中聲明member
的分配。 您也可以在聲明模板類的頭文件中使用內聯文件(.inl)和#include
.inl文件。
似乎在C ++ 98中,如果引用成員變量,則調用默認構造函數的以下語法不會在GCC或clang下編譯:
template <>
const B<type> A<type>::member/*()*/;
類型是任何類型。
但是,以下情況:
template <class T>
const B<T> A<T>::member/*()*/;
我不確定這是一個錯誤,還是只是錯誤的語法。 我建議改為做以下事項:
template <>
const B<type> A<type>::member = B<type>();
或者如果您使用的是C ++ 11,則可以使用大括號來調用默認構造函數,如下所示:
template <>
const B<type> A<type>::member{};
如果使用常規括號,編譯器將在A<type>
類中使用靜態函數,如果不使用括號,則將獲得undefined reference to 'A<type>::member'
鏈接器錯誤的undefined reference to 'A<type>::member'
。 您可以在這里看到。
以下是Aaron和我發現此錯誤的討論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.