【问题标题】:C++ template compilation error: expected primary-expression before ‘>’ token [duplicate]C++ 模板编译错误:“>”标记之前的预期主表达式
【发布时间】:2011-03-31 03:52:24
【问题描述】:

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

#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++ 没有错误!错误在标记的行&lt;--- 中。同样,如果我将问题行更改为

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

错误消失(问题在显式&lt;std::string&gt;)。

Boost.PropertyTree 需要 Boost >= 1.41。请帮助我理解并修复此错误。


请参阅 Templates: template function not playing well with class’s template member function — 一个类似的热门问题,其中包含其他好的答案和解释。

【问题讨论】:

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


【解决方案1】:

你需要做的:

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

在与typename 相同的情况下使用template,除了模板成员而不是类型。

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

【讨论】:

  • 不错。您是否有用于模板使用的特定资源?我好奇地问。我的书似乎都没有解决这个问题。
  • @Chance:很遗憾,我没有,虽然你可能会在this list 中找到一个,即C++ 模板,完整指南
  • 为什么要告诉编译器它是一个模板?编译器不应该能够自己解决这个问题吗?
  • @HelloGoodbye:我不记得在 C++ 中理论上是否有可能让编译器始终正确推断它,可能不是。问题是没有template,它可以被解析为(pt.get) &lt; std::string &gt; ("path");,也就是比较。在这种情况下,类型名称的比较是不可能的,所以它可以弄清楚,但一般来说你会如何解析pt.val &lt; 5 &gt; (10)?添加template 直接告诉编译器“这是一个函数调用”。
  • 啊,好吧,这又是比较运算符和模板表示法的旧不兼容问题...... :P 嗯,这是有道理的。我猜 D 编程语言在这里占据上风,它的 (...) 模板语法而不是 C++ 的 &lt;...&gt; 语法:)
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2012-07-08
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多