2016-02-28 9 views
5

Hier sind die Codes, die unter g++ gut funktionieren, aber geben Fehler unter VC++ 2014:Templat-Codes funktioniert gut unter G ++ aber Fehler unter 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; 
} 

Warum? Vielen Dank!

Die Fehlermeldungen sind:

Fehler C2039: 'STATUS_': ist kein Mitglied der

'Foo'

Fehler C2065: 'STATUS_': undeclared Identifikator

Fehler C2131: Ausdruck wurde nicht zu einer Konstante ausgewertet

+2

Clang und ICC lehnen beide diesen Code ebenfalls ab. Vermutlich werden die Vorlagen von GCC einfach nicht instanziiert, weil Sie sie überhaupt nicht verwenden. Sein Optimierer ist ziemlich schlau; es weiß, dass der ganze Code does return 0 ist. –

+1

@CodyGray Ich nehme an, 'A' ist ein unvollständiger Typ innerhalb von 'Expression', es geht also nicht um * smarte * Optimierung, oder? –

+0

@piotr Nun, ich würde sagen, es ist ziemlich schlau, wenn es erkennt, dass keine der Vorlagen verwendet wird, und macht das ganze Chaos einfach, indem es einfach das Programm in die "Haupt" -Funktion umwandelt. Ihre Laufleistung kann variieren. :-) –

Antwort

2

Definieren Sie status und es wird funktionieren. Siehe unten. Was den Standard betrifft, weiß ich nicht, welcher Compiler korrekt ist.

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; 
} 
Verwandte Themen