2010-08-17 12 views
34

Este código se compila y funciona como se esperaba (se lanza en tiempo de ejecución, pero no importa):C++ plantilla de error de compilación: se espera primaria-expresión antes '>' símbolo

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

Pero tan pronto como añadir plantillas y cambiar el prototipo foo en

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

consigo un error en GCC:

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

pero no hay errores con MSVC++! El error está en la línea marcada <---. Y de nuevo, si cambio de la línea problema en

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

desaparece el error (el problema está en <std::string> explícita).

Boost.PropertyTree requiere Boost> = 1.41. Por favor, ayúdame a comprender y corregir este error.


Ver Templates: template function not playing well with class’s template member function - una pregunta popular similar que contiene otras buenas respuestas y explicaciones.

+1

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

+1

Sí, es un duplicado. ¡Gracias por tu ayuda! –

Respuesta

47

que tiene que hacer:

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

Uso template en la misma situación que typename, a excepción de los miembros de la plantilla en lugar de tipos.

(Es decir, puesto pt::get es un miembro de la plantilla dependientes de un parámetro de plantilla, es necesario indicar al compilador que es una plantilla.)

+0

Agradable. ¿Tiene un recurso específico que utiliza para el uso de la plantilla? Lo pregunto por curiosidad. Ninguno de mis libros parece abordar este problema. – Chance

+0

@Chance: lamentablemente no puedo encontrar uno [esta lista] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), es decir * Plantillas C++, la guía completa *. – GManNickG

+2

¿Por qué necesita decirle al compilador que es una plantilla? ¿No debería el compilador ser capaz de resolver eso por sí mismo? – HelloGoodbye

Cuestiones relacionadas