2013-04-18 16 views
8

Ich verwende folgenden Code mit C++ 11 und bekomme einen Fehler, den ich nicht verwenden darf typeof!Warum C++ erlaubt mir nicht, typeof zu verwenden?

Was ist das Problem und wie kann man das beheben?

Der Fehler:

Error 10 error C2923: 'typeof' is not a valid template type argument for parameter 'C' 

Hier ist mein Code:

#define HIBERLITE_NVP(Field) hiberlite::sql_nvp< typeof(Field) >(#Field,Field) 


class Person{ 
friend class hiberlite::access; 
template<class Archive> 
void hibernate(Archive & ar) 
{ 
    ar & HIBERLITE_NVP(name); //ERROR 
    ar & HIBERLITE_NVP(age); //ERROR 
    ar & HIBERLITE_NVP(bio); //ERROR 
} 
public: 
string name; 
double age; 
vector<string> bio; 
}; 

sql_nvp das ist wie:

template<class C> 
class sql_nvp{ 
public: 
    std::string name; 
    C& value; 
    std::string search_key; 

    sql_nvp(std::string _name, C& _value, std::string search="") : name(_name), value(_value), search_key(search) {} 
}; 
+25

Wie wäre es mit "C++ hat keinen' typeof' "? – Xeo

+3

Verwenden Sie stattdessen 'declltype'. – deepmax

+1

Alternativ könnten Sie eine Funktionsvorlage schreiben, die auf den Typ schließen kann, z. 'make_nvp (# Feld, Feld)'. Dies funktioniert auch in älteren Versionen der Sprache ohne 'declltype'. –

Antwort

27

Was Sie suchen, ist decltype():

#define HIBERLITE_NVP(Field) hiberlite::sql_nvp< decltype(Field) >(#Field,Field) 
//            ^^^^^^^^ 

C++ hat keinen Operator namens typeof.

+2

Es ist erwähnenswert, dass es Unterschiede zwischen' typeof' und 'declype' gibt. Abhängig davon, welcher Compiler und welche Version 'typeof (X)' geliefert haben, ist es eher wie 'std :: decay (X))> :: type' als rohe 'decltype (X)'. –

+1

noone erwähnt, dass declltype nur in C++ 11 verfügbar ist? – blue

+2

@blue: Keine Notwendigkeit. Das OP schreibt explizit: "* Ich verwende folgenden Code mit C++ 11 *" –

Verwandte Themen