持つ:
struct Value
{
template<class T>
static constexpr T value{0};
};
(0) イデオン
template<typename TValue>
struct Something
{
void x()
{
static_assert(TValue::template value<int> == 0, "");
}
};
int main() { Something<Value>{}.x(); return 0; }
clang++ 3.6 ではコンパイルできません。
エラー: テンプレート引数リストがないと、変数テンプレート '値' を参照できません
g++ 5.2 ではコンパイルできません。
エラー: 'template constexpr const T Value::value' は関数テンプレートではありません
(1) イデオン
clang++ と g++ の両方でコンパイルできます。
struct Something
{
void x()
{
static_assert(Value::template value<int> == 0, "");
}
};
int main() { Something{}.x(); return 0; }
(0)がコンパイルに失敗するのはなぜですか?
テンプレート パラメーター (この場合は ) を介して変数テンプレートにアクセスすると、問題が発生するようですTValue
。キーワードの型エイリアスを定義するTValue
か、typename
キーワードを使用しても問題は解決しません。
何が起きてる?