2010-08-17 14 views
34

Ten kod kompiluje i działa zgodnie z oczekiwaniami (rzuca w czasie wykonywania, ale nie szkodzi):C++ szablonu błąd kompilacji: Oczekuje podstawowej wyrażenie przed „>” żeton

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

ale jak tylko dodam szablony i zmienić prototyp foo w

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

otrzymuję błąd w GCC:

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

, ale bez błędów z MSVC++! Błąd znajduje się w zaznaczonej linii <---. I znowu, jeśli zmienię linię problem na

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

znika błąd (problem jest w wyraźnej <std::string>).

Boost.PropertyTree wymaga zwiększenia> = 1,41. Pomóż mi zrozumieć i naprawić ten błąd.


Zobacz Templates: template function not playing well with class’s template member function - podobne pytanie popularny zawierające inne dobre odpowiedzi i wyjaśnień.

+1

pokrewne: http://stackoverflow.com/questions/1682844/ szablony-szablon-funkcja-nie-gra-dobrze-z-klasy-szablon-członek-functi/1682885 (duplikat?) – GManNickG

+1

Tak, jest to duplikat. Dziękuję za pomoc! –

Odpowiedz

47

Co trzeba zrobić:

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

Korzystając template w takiej samej sytuacji jak typename, za wyjątkiem członków szablonu zamiast typów.

(To znaczy, ponieważ jest członkiem pt::get szablon zależny na parametr szablonu, trzeba poinformować kompilator to jest szablon.)

+0

Nice. Czy masz określony zasób, którego używasz do użycia szablonu? Pytam z ciekawości. Żadna z moich książek nie zajmowała się tym problemem. – Chance

+0

@Chance: Nie, niestety, można znaleźć jedną z [tej listy] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), a mianowicie: * Szablony w C++, Kompletny przewodnik *. – GManNickG

+2

Dlaczego musisz powiedzieć kompilatorowi, że to szablon? Czy nie powinien sam kompilator sam to wymyślić? – HelloGoodbye

Powiązane problemy