2016-02-28 39 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: '狀態_':不是 '富'

錯誤C2065的成員: '狀態_':未聲明的標識符

錯誤C2131:表達式沒有評估到一個常數

+2

Clang和ICC都拒絕這個代碼。據推測,GCC根本就沒有實例化模板,因爲你完全不使用它們。它的優化器非常聰明;它知道所有的代碼都是'return 0'。 –

+1

@CodyGray我猜''Expression'中的'A'是一個不完整的類型,所以它不是*「智能」*優化的問題,還是它? –

+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; 
}