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


148

私はこれをしたいと思います:

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

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

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


std::stringタイプにも適用
Trevor Boyd Smith

c ++ 11以降、キーワードinlineが変更され、静的変数を宣言時に初期化できるようになりました。したがって、この宣言は「inline static double something_relevant = 1.5;」のようになります。

@ user8991265 C ++ 11以降ではなくC ++ 17以降でインライン変数を使用できると思います。
zupazt3

回答:


195

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

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

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

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


4
@sbi:1つの定義ルールに違反していませんか?
Alexandre C.

7
いいえ、テンプレートについて話しているのではありません。そうでなければ、関数テンプレートもそうします。
sbi

1
@ sbi、@ Prasoon:実際にはPrasoonが最初のようです。しかし、ODRについてのコメント(これが私の最大の関心事でした)のため、私はまだsbiを受け入れます。
Alexandre C.

1
@sbiはテキストの上にカーソルを合わせます:)
Johannes Schaub-litb

5
@ヨハネス:くそったれ、私は1年間ここにいる、そしてそれを知らなかった!他に何が欠けていますか?(投票数をクリックしたときに表示される2つの数字はバグではなく機能であることを発見したときの恥を今でも覚えています。)<goes_playing>わあ、名前の上にマウスを置くと、担当者が見えます!それも知らなかった。@Prasoon:いいえ、そうです、私は繰り返し現在の場所に到着しました。(だからこそ、私はあなたの回答に賛成票を投じました。)
sbi 2010

36

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

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

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


1
これは素晴らしい答えです。短くて正確。詳細については、en.cppreference.com / w / cpp / language / static#Static_data_membersも参照してください。
andreee 2018

31

これは動作します

template <typename T>
 struct S
 {

     static double something_relevant;
 };

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

something_relevant変数を定義しませんでした(template<typename T> double S<T>::something_relevant=1.5;)エラーをスローするコンパイラを削除しました。理由は何ですか?
goodman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.