Подтвердить что ты не робот

Ошибка компиляции шаблона С++: ожидаемое первичное выражение перед '> токеном

Этот код компилируется и работает как ожидалось (он запускается во время выполнения, но неважно):

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

Но как только я добавляю шаблоны и изменяю прототип foo в

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

Я получаю сообщение об ошибке в GCC:

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

но никаких ошибок с MSVС++! Ошибка находится в отмеченной строке <---. И снова, если я изменю проблемную строку на

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

ошибка исчезает (проблема в явном <std::string>).

Boost.PropertyTree требует Boost >= 1.41. Пожалуйста, помогите мне понять и исправить эту ошибку.


См. Шаблоны: функция шаблона не очень хорошо работает с функцией члена шаблона классов - аналогичный популярный вопрос, содержащий другие хорошие ответы и объяснения.

4b9b3361

Ответ 1

Вам нужно сделать:

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

Используйте template в той же ситуации, что и typename, за исключением членов шаблона вместо типов.

(То есть, поскольку pt::get является членом шаблона, зависящим от параметра шаблона, вам нужно сообщить ему, что это шаблон.)