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

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

#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

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

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

, ошибка исчезнет (проблема в явном ).

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


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

35
задан Community 23 May 2017 в 12:02
поделиться

1 ответ

Вам необходимо:

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

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

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

59
ответ дан 27 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: