此代码按预期编译和工作(它在运行时抛出,但没关系):
#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");
错误消失(问题出现在显式<std::string>
)。
Boost.PropertyTree要求Boost&gt; = 1.41。请帮助我理解并修复此错误。
请参阅Templates: template function not playing well with class’s template member function - 一个包含其他好答案和解释的类似热门问题。
答案 0 :(得分:57)
你需要这样做:
std::cout << pt.template get<std::string>("path");
在与template
相同的情况下使用typename
,但模板成员而非类型除外。
(也就是说,由于pt::get
是模板参数的模板成员依赖,因此您需要告诉编译器它是模板。)