C ++模板编译错误:在'>'标记之前的预期primary-expression

时间:2010-08-17 18:32:19

标签: c++ visual-c++ gcc boost compiler-errors

此代码按预期编译和工作(它在运行时抛出,但没关系):

#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 - 一个包含其他好答案和解释的类似热门问题。

1 个答案:

答案 0 :(得分:57)

你需要这样做:

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

在与template相同的情况下使用typename,但模板成员而非类型除外。

(也就是说,由于pt::get是模板参数的模板成员依赖,因此您需要告诉编译器它是模板。)