2009-08-21 13 views
5

Sto riscontrando qualche problema nel compilare questo codice in Linux ma funziona perfettamente in Windows.problema di modello C++ in codice multipiattaforma

di Windows compilatore: Visual Studio 2005

Linux compilatore: versione di gcc 3.4.3 20.041.212 (Red Hat 3.4.3-9.EL4)

class DoSomething 
{ 
    public: 
    template <class DataType> 
    bool Execute() 
    { 
     //do something here 
    } 
}; 


template <class Operator> 
TypeSwitch(int DataTypeCode, Operator& Op) 
{ 
    switch (DataTypeCode) 
    { 
    case 1: return Op.Execute<char>(); 
    case 2: return Op.Execute<int>(); 
    //snip; 
    } 
} 

//To call the operator 
TypeSwitch(Code,DoSomething); 

In Windows questo codice funziona perfettamente e fa esattamente quello che voglio io. In Linux, ottengo gli errori:

errore: atteso primaria espressione prima di '>' token

errore: atteso primaria espressione prima di ')' token

per ciascuna delle linee con il caso dichiarazione.

Qualche idea?

Grazie, Mike

+0

linee Wich sono indicati dagli errori? – Klaim

+0

Dice nel suo post: "per ciascuna delle righe con la dichiarazione del caso". – DeusAduro

+0

Sei sicuro che il codice viene compilato? posso vedere diversi errori. Dov'è il tipo di ritorno TypeSwitch? –

risposta

13

il problema è che quando il compilatore incontra Op.Execute<char>(); e cerca di analizzarlo, si confonde.

Op è un nome dipendente, quindi il compilatore non sa molto dei suoi membri. Quindi non sa che Execute è una funzione modello. Invece, presuppone che il < significhi meno di. Che stai cercando di confrontare qualche membro sconosciuto Execute con qualcos'altro.

Così, invece, la linea dovrebbe essere simile a questo:

case 1: return Op.template Execute<char>(); 

Ora il compilatore sa che Execute è un modello, in modo da quando incontra < non è "inferiore", ma l'inizio del template parametri.

Il problema è simile al modo in cui è necessario typename quando si specificano tipi appartenenti a un nome dipendente. Quando si fa riferimento a una funzione membro del modello e gli argomenti del modello vengono forniti esplicitamente, è necessario la parola chiave template.

Il comportamento di GCC è corretto e MSVC è troppo indulgente. Se si aggiunge la parola chiave template, il codice funziona in entrambi i compilatori (ed essere corretto in base allo standard)

+2

Benvenuti nel meraviglioso mondo magico delle regole di parsing dei modelli C++! –

+0

Ah, grazie! Darò questa prova quando torno al lavoro lunedì mattina, ma la tua descrizione sembra giusta. Adoro le sottigliezze con i modelli! – miked

+0

Solo un seguito per chiunque altro abbia bisogno di questo: ho appena provato questo e ho scoperto che c'è un bug noto in MSVC che la correzione di cui sopra non funziona. Quindi in Windows è necessario Op.Execute () e in non-windows è necessario Op.template Execute (). – miked

1
case 1: return Op.template Execute<char>(); 
case 2: return Op.template Execute<int>(); 

See: template as qualifier

Inoltre, TypeSwitch() restituisce un bool

Problemi correlati