web-dev-qa-db-ja.com

クラステンプレートでの静的メンバーの初期化

これをやりたい:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

something_relevantは整数型ではないため、できません。 Tには依存しませんが、既存のコードはSの静的メンバーであることに依存しています。

Sはテンプレートであるため、定義をコンパイル済みファイルに入れることはできません。この問題を解決するにはどうすればよいですか?

130
Alexandre C.

ヘッダーで定義するだけです:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

すべてのテンプレートと同様に、コンパイラはテンプレートの一部であるため、コンパイラは一度だけ定義されるようにします。

167
sbi

これは動作します

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;
31
Prasoon Saurav

C++ 17以降、静的メンバーをinlineとして宣言できるようになりました。これにより、クラス定義で変数が定義されます。

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};

ライブ: https://godbolt.org/g/bgSw1

17
xaxxon