2017-01-28 4 views
6

のexternテンプレート '矛盾した明示的なインスタンス化'

#include <vector> 

// Case I: error 

エラーC2961を考えると矛盾 明示的なインスタンス、前の明示的なインスタンスは は

'にはextern template' を指定していませんでした
template class std::vector<int>; 
extern template class std::vector<int>; 


// Case II: fine 
//extern template class std::vector<int>; 
//template class std::vector<int>; 

// Case III: fine 
//extern template class std::vector<int>; 
//template class std::vector<int>; 
//template class std::vector<int>; 

// Case IV: fine 
//extern template class std::vector<int>; 
//extern template class std::vector<int>; 
//template class std::vector<int>; 
//template class std::vector<int>; 


int main() 
{ 

} 

VS2015バージョン4.6でコードをビルドし、C2961エラーを参照してください。しかし、コンパイラhttp://gcc.godbolt.org/のエラーは表示されません。

これはVS2015のバグですか?

+1

'std :: vector'は少なくとも2つのテンプレート引数をとりますが、1つではありません。 (実際の数は実装定義です。) – ildjarn

+3

@ildjarnなぜデフォルトは失敗しますか? –

+0

@ildjarn 'Vector'の第2引数は完全にオプションです。 http://www.cplusplus.com/reference/vector/vector/ –

答えて

6

この場合、MSVCとClangはエラーを発行する権利があります。標準で/ 11は言い[temp.explicit]:

エンティティが明示的なインスタンス 宣言と同じ 翻訳単位で明示的なインスタンスの定義の両方の対象である場合は、定義が宣言に従わなければなりません。 [...]

template class std::vector<int>;は明示的なインスタンス化の定義です。 externのインスタンスは、明示的なインスタンス化宣言です。

[...]プログラムが明示的に定義されたテンプレートをインスタンス化することができる:明示的std::vector<int>をインスタンス化する[namespace.std]/2に係るいずれの場合にも病気に形成されている


注 宣言が ユーザー定義型の名前に依存し、インスタンス化が元のテンプレートの標準ライブラリの 要件を満たしている場合にのみ、標準ライブラリになります。所与のテンプレートとテンプレート引数の所与のセットについて

もケースIII及びIVは、また/ 5 [temp.spec]に記載のIII族形成されていることに注意してください

  • 明示的なインスタンスの定義がプログラムの中で、最高1回出現するもの、

[ ...]

この ルールの違反を診断するための実装は必要ありません。

関連する問題