2011-11-08 14 views
0

次は、MSVC++ 10 Sp1の「内部コンパイラエラー」です。部分的および明示的テンプレート特殊化の奇妙なエラー

とGCCの:

b.cpp:16:12:エラー:28:16:エラー:非名前空間スコープ内の明示的な特殊化

b.cpp ':: Bをストラクト'主なテンプレートの宣言では、テンプレート-ID「F」

//class template 
template< class T> 
struct A{ 

    //struct B {}; //Remove the comment and it will compile! 
}; 

//partial specialization 
template< class T > 
struct A< T* > 
{ 
    struct B { 

     template<class C> void f(){} 

      //"Internal Compiler Error" 
     template<>   void f<int>(){}; 

    }; 
}; 

struct B前のコメントが削除された場合しかし、それがコンパイルされます!

私は問題を理解していません!

+2

まず、それをコンパイルすることになっていません。そしてあなたはバグレポートを提出することになっています。ここに質問はありません。ソースがないコードでバグを説明することはできません。 –

+0

これも削除されたコメントとともにコンパイルすべきではありません。 –

+0

テンプレートクラスのテンプレート関数を明示的に特殊化するための[C++構文]の複製がありますか?](http://stackoverflow.com/questions/2097811/c-syntax-for-explicit-specialization-of-a-template-function -in-a-template-clas) –

答えて

2

あなたのコードにバグがあり、MSVC++はそれに対処していません。 gccコンパイルでは次のようになります。

$ make parspec.o 
g++ -c -o parspec.o parspec.cc 
parspec.cc:17: error: explicit specialization in non-namespace scope ‘struct A<T*>::B’ 
make: *** [parspec.o] Error 1 

要するに、クラスまたは構造体の中で特殊化することはできません。

編集: MSVC++はこのような不適合な構造を許していると私は推測していますが、彼らは非常にうまくやっていないと思います。

+0

しかし、表示されたコメントが削除された場合、コンパイルするのはどうですか? –

+0

@ user578832:これはGCCのバグです。コンパイルするべきではありません。 –

+0

@ user578832:おそらく私の記憶は私が長いことこの事を見ていないので私には失敗しているかもしれませんが、最後に私がチェックした時、私は標準がそれを許さないと確信しています。 –

0

クラステンプレートの複数インスタンスのメンバ関数を特殊化することはできません。これは許可されています

template<typename T> 
struct A{ 
}; 

template<typename T> 
struct A<T*> 
{ 
    struct B { 
     template<class C> void f(); 
    }; 
}; 

template<typename T> 
template<typename C> 
void A<T*>::B::f() {} 

template<> 
template<> 
void A<char*>::B::f<int>() {} 

しかし、これではありません。

template<typename T> 
template<> 
void A<T*>::B::f<int>() {} 
関連する問題