19

最近の g++-5 コンパイラを試しているときに、以下のステートメントをファイルに書きました。

template<T> T a;
template<> int a = 1;

結果は次のとおりです。

警告: のテンプレート ヘッダーが多すぎますa(0 にする必要があります)

また、効果的には、実際には特化していませんa<int>。例えば

template<typename T> T a;
template<> int a = 1;

int main ()  {
  std::cout << a<double> << "\n";  // prints 0; OK
  std::cout << a<int> << "\n";  // prints 0! why not 1?
}

この構文の謎は何ですか?

4

1 に答える 1

23

テンプレート引数は、関数テンプレートの明示的な特殊化でのみ省略できます。変数テンプレートがあるため、以下を含める必要があります<int>

template<> int a<int> = 1;

C++14 (n4140)、14.7.3/10 (強調鉱山) の引用:

末尾のテンプレート引数は、関数の引数の型から推測できる場合、明示的な関数テンプレートの特殊化を指定するtemplate-idで未指定のままにすることができます。

タイプを繰り返したくない場合は、次を使用できますauto

template<> auto a<int> = 1;

【実例】 Clangを使って。

これに関して注意すべき点が 1 つあります。 を使用する場合auto、特殊化された変数の型は、テンプレート引数からではなく、初期化子から推定されます。また、特殊化はプライマリ テンプレートとは異なる型を持つことができるため、コンパイラはそれらが異なっていても喜んで受け入れます。

于 2015-05-05T11:30:35.437 に答える