2010-08-17 4 views
34

Ce code compile et fonctionne comme prévu (il jette à l'exécution, mais jamais l'esprit):C++ erreur de compilation du modèle: l'expression primaire attendue avant « > » jeton

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

Mais dès que j'ajouter des modèles et changer le prototype foo dans

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

Je reçois une erreur dans GCC:

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

mais pas d'erreurs avec MSVC++! L'erreur est dans la ligne marquée <---. Et encore, si je change la ligne de problème dans

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

l'erreur disparaît (le problème est explicite <std::string>).

Boost.PropertyTree nécessite Boost> = 1,41. S'il vous plaît, aidez-moi à comprendre et corriger cette erreur.


Voir Templates: template function not playing well with class’s template member function - une même question populaire contenant d'autres bonnes réponses et des explications.

+1

connexes: http://stackoverflow.com/questions/1682844/ templates-template-function-not-playing-well-avec-classs-template-member-functi/1682885 (Dupliquer?) – GManNickG

+1

Oui, c'est un doublon. Merci de votre aide! –

Répondre

47

que vous devez faire:

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

Utilisez template dans la même situation que typename, à l'exception des membres de modèle au lieu de types.

(C'est, depuis pt::get est membre de modèle dépendant d'un paramètre de modèle, vous devez dire au compilateur, il est un modèle.)

+0

Nice. Avez-vous une ressource spécifique que vous utilisez pour l'utilisation de modèles? Je demande par curiosité. Aucun de mes livres n'a semblé résoudre ce problème. – Chance

+0

@ Chance: Malheureusement, même si vous pourriez en trouver un autre [cette liste] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), à savoir * Modèles C++, Le guide complet *. – GManNickG

+2

Pourquoi avez-vous besoin de dire au compilateur que c'est un modèle? Le compilateur ne devrait-il pas être capable de comprendre cela par lui-même? – HelloGoodbye

Questions connexes