簡體   English   中英

如何根據模板化類中的T初始化類型的靜態const成員?

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

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