2010-08-17 2 views
34

Questo codice compila e funziona come previsto (si getta in fase di esecuzione, ma non importa):C++ template errore di compilazione: atteso primaria espressione prima di '>' token

#include <iostream> 
#include <boost/property_tree/ptree.hpp> 

void foo(boost::property_tree::ptree &pt) 
{ 
    std::cout << pt.get<std::string>("path"); // <--- 
} 

int main() 
{ 
    boost::property_tree::ptree pt; 
    foo(pt); 
    return 0; 
} 

Ma appena aggiungo modelli e modificare il prototipo foo in

template<class ptree> 
void foo(ptree &pt) 

ottengo un errore nel GCC:

test_ptree.cpp: In function ‘void foo(ptree&)’: 
test_ptree.cpp:7: error: expected primary-expression before ‘>’ token 

ma nessun errore con MSVC++! L'errore è nella riga contrassegnata <---. E ancora, se cambio la linea problema in

--- std::cout << pt.get<std::string>("path"); // <--- 
+++ std::cout << pt.get("path", "default value"); 

l'errore scompare (il problema è in esplicita <std::string>).

Boost.PropertyTree richiede Boost> = 1.41. Per favore aiutami a capire e correggere questo errore.


Vedi Templates: template function not playing well with class’s template member function - una domanda popolare simile contenente altre buone risposte e spiegazioni.

+1

correlati: http://stackoverflow.com/questions/1682844/ template-template-function-not-playing-well-with-classs-template-member-functi/1682885 (Duplicato?) – GManNickG

+1

Sì, è un duplicato. Grazie per l'aiuto! –

risposta

47

quello che devi fare:

std::cout << pt.template get<std::string>("path"); 

Usa template nella stessa situazione di typename, tranne che per i membri del modello invece di tipi.

(Cioè, dal momento che pt::get è un membro modello dipendente su un parametro di template, è necessario dire al compilatore è un modello.)

+0

Bello. Hai una risorsa specifica che usi per l'uso del modello? Chiedo per curiosità. Nessuno dei miei libri sembrava affrontare questo problema. – Chance

+0

@Chance: io non, purtroppo, sebbene tu possa trovarne uno fuori [questo elenco] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), vale a dire * Modelli C++, la guida completa *. – GManNickG

+2

Perché hai bisogno di dire al compilatore che è un modello? Non dovrebbe il compilatore essere in grado di capirlo da solo? – HelloGoodbye