2016-09-15 5 views
0

に使用されている場合、私はは違い、「型名は」テンプレートの特殊

template <typename a, typename b, typename c> 
class myclass 
{ 

}; 

のような単純なテンプレートを持っていると私は私が次の両方の方法でテンプレートを特化できることを実現:

なぜそこ
template <typename a, typename b> 
class myclass<a, b, int> 
{ 

}; 

template <typename a, typename b> 
class myclass<a, b, typename int> 
{ 

}; 

"typename int"と "int"の間に違いはありませんか?

+11

必ずmsvcを使用してください。 –

+3

* "そして、私は次の両方の方法でテンプレートを専門にすることができます:" * gccとclangは本当に反対します。 –

+0

動作しないでください。 [そして、うまくいきません](http://ideone.com/qOzFZ8)。あなたのコンパイラはバグです。 –

答えて

1

これは、視覚的なスタジオのバグである必要があります。 Visual Studioでは2つのフェーズ名のルックアップが実装されておらず、従属型の意味を持たないため、エラーなしでコンパイルすることができます。しかし、gccでコンパイルすると、次のエラー得られます:

main.cpp:11:33: error: template argument 3 is invalid 
class myclass<a, b, typename int> 
        ^

をしかし、依存名とそれを使用した場合、typenameキーワードは、型以外の値または他の事ではありませんコンパイラに伝えるために表示される必要があります。実際には、typenameキーワードは、本当に必要なときにのみ表示する必要があります。

しかし、コンパイラは、式が継承のような型に変換されなければならないことを既に知っているというコンテキストがあります。そこに従属名の前にtypenameを置くと、エラーが発生します。そのエラーに

template <typename A> 
struct MyType : typename std::decay<A>::type {}; 

この結果:このコードを見てください、テンプレート内のあいまいな文がされていたときに

main.cpp:6:17: error: keyword 'typename' not allowed in this context (the base class is implicitly a type) 
struct MyType : typename std::decay<A>::type {}; 
       ^

コンパイラは、キーワードのみを必要としています。それ以外の場合は、これらのキーワードを入力することはできません。

関連する問題