2016-02-28 1 views
5

下のエラーがg++の下で正常に動作コード、ですが、VC++ 2014の下にエラーを与える:テンプレートコードGの下で正常に動作しますが、ここ++ VC++

template <class A> 
struct Expression 
{ 
public: 
    static const int status = A::status_; 
}; 

struct Foo : public Expression<Foo> 
{ 
    static const int status_ = 0; 
}; 

int main(void) { 
    return 0; 
} 

なぜ?ありがとう!

エラーメッセージは次のとおり

エラーC2039: 'ステータス:': 'ステータス:':宣言されていない識別子

エラーC2131 'foo' で

エラーC2065のメンバーではありません。式は定数に評価されませんでした

+2

ClangとICCはこのコードも拒否しています。おそらく、GCCはテンプレートをまったく使用しないため、テンプレートをインスタンス化していないだけです。そのオプティマイザはかなりスマートです。それはすべてのコードが 'return 0'であることを知っています。 –

+1

@CodyGray 'A'は' Expression'の中の不完全な型だと思うので、それは*スマートな最適化の問題ではありませんか? –

+0

@piotrテンプレートのどれも使用されておらず、プログラムを 'main'関数に変換するだけで全面的に混乱することがわかっていれば、それはかなり賢いと思います。あなたのマイレージは異なる場合があります。 :-) –

答えて

2

statusを定義してください。下記参照。標準的には、どのコンパイラが正しいか分かりません。

template <class A> 
struct Expression 
{ 
public: 
    static const int status; 
}; 

struct Foo : public Expression<Foo> 
{ 
    static const int status_ = 0; 
}; 

template< typename A > 
const int Expression<A>::status = A::status_; 

int main(void) { 
    return 0; 
} 
関連する問題