大規模なプログラムの特性クラスの一部として、含まれているクラス テンプレートのインスタンス化に使用された型に応じて異なる値を持つ可能性のある静的クラス変数を作成しようとしました。
関連するコードを単純化して、私が話していることの必要最小限の例を作成しました。
#include <iostream>
#include <string>
#include <type_traits>
template <class T, class Enable = void>
struct Foo;
template <class T>
struct Foo<T,
typename std::enable_if<std::is_integral<T>::value>::type
>
{
static std::string message;
};
template <class T>
struct Foo<T,
typename std::enable_if<std::is_floating_point<T>::value>::type
>
{
static std::string message;
};
template <class T, class Enable>
std::string Foo<T, Enable>::message;
GCC 4.6 では、これによりコンパイラ エラーが発生します: template definition of non-template ‘std::string Foo<T, Enable>::message
. この問題は、最後の 2 行で静的変数を定義しているだけで発生しますstd::string Foo<T, Enable>::message
。
なぜこれが起こっているのか混乱しています。最後の 2 行を省略すると、コンパイラ エラーはなくなります (もちろん、リンカー エラーが発生します)。これは GCC のコンパイラ エラーですか?