Visual C++ 2015ではコンパイルされませんが、GCC 4.8.4ではコンパイルされないコードがあります。どちらが正しいのだろうか?問題のコードは、ここでは以下の通りです:テンプレートパラメータとしてオーバーライド指定子 - 有効ですか?
template <class T> class ATemplate;
template <class R, class A1>
struct ATemplate<R(A1)>{ };
int main()
{
ATemplate<void(int)> x;
// ATemplate<void(int)override> y; //---Does not compile!!!
return 0;
}
が、それは間違ってここに下記(またはconstの)指定子としてオーバーライドを使用することです。同じようなコードがGMockライブラリに存在し、実際の関数シグニチャーと同様に、テンプレートパラメータ(オーバーライドを含む)を生成するためにマクロ展開が使用されます。コメントアウト行取り外すとき
のVisual C++ 2015は、次のエラーを生成します。オーバーライドは無料機能(有効なポイント)の文脈では無意味であることを言及下記の回答
x.cpp(11): error C2062: type 'int' unexpected
x.cpp(11): error C2976: 'ATemplate': too few template arguments
x.cpp(4): note: see declaration of 'ATemplate'
x.cpp(11): error C2079: 'y' uses undefined class 'ATemplate'
ワン - これを行いますGCCの意味が間違っています。 const指定子もそのような場合(無償機能のために)無意味ですが、それにもかかわらず(VC++によって)???また、仮想指定子は宣言にのみ存在する必要があることを言及しています。これは(この定義が存在しないため)このケースには何の違いもありません。仮想キーワードについては、コードがコンパイルされているかどうかには何の違いもないので、派生クラスでは大丈夫ですが、オーバーライドの場合は大きな違いがあるのでOKではありません。 (GMockが行うように)がReturnType(ArgType引数)...可能CONSTを使用するか、マクロのパラメータとして指定をオーバーライドし、VCCによって課される制限が(余りにクランのために明らかにケース)をコンパイルしないように、このコードを引き起こす
。どちらが正しい?
標準では、このコンテキスト(テンプレートパラメータのコンテキスト)でオーバーライド指定子を使用しないと述べていませんか?
私はおそらく何かを明らかに不足しているんだけど、どこ上書きする機能がありますか? –
@KarolyHorvathそれは無関係です –
@KarolyHorvath、はい、それは無関係です。投稿されたコードは最小限で、エラーが発生します。 –