2
#include <string>
...
template <typename DefinitionsIterator>
void parse(const CIET_NS ::VariadicArguments& argumentList, DefinitionsIterator firstDef, DefinitionsIterator lastDef, Map& res)
{
    for (int i = 0; i < argumentList.size(); ++i) {
        CIET_NS ::Object obj = argumentList.at(i);
        std::string objStr = obj.convert<std::string>();
        qDebug() << objStr.c_str();

        //qDebug() << argumentList.at(i).convert<std::string>().c_str();

    }

此代码可以编译,但注释的行没有。我收到此错误

 error: expected primary-expression before '>' token

这怎么可能发生?

template <typename ChildClass, typename ListElementType, typename DuplicateType>
class BasicObject
{
public:
    BasicObject();
    ~BasicObject();

public:
    Tcl_Obj* tclObject() const;
    Tcl_Obj* releaseObject();
    template <typename T>
    T convert(Interpreter& interp) const;
    template <typename T>
    T convert() const;

Object来源于BasicObject

Compiler version:
g++ -v
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-9)
4

2 回答 2

8

convert是一个模板,你必须指出(类似于使用typename来表示一个名称是一个类型)。

qDebug() << argumentList.at(i).template convert<std::string>().c_str();
                               ^^^^^^^^

否则编译器认为这<是一种比较,并且在看到>可以比较的东西之前会感到困惑。

于 2013-04-19T13:40:22.730 回答
0

你的编译器是古老的——根据你提供的数据,它是 GCC 3.4.6,它与 RHEL4 一起提供,几年前被供应商 EOL(是的,现在它处于“延长生命周期”直到 2015 年,这意味着你真的,真的不应该在上面部署新的应用程序)。

应该与任何受支持的 Qt 版本一起使用的最旧的 GCC 版本是 GCC 4.2(在特殊情况下)和 GCC 4.4(对于 Qt 4.7)。你的编译器有一个错误。为什么需要部署在这样一个无法编译有效 C++ 代码的古老平台上?

于 2013-04-19T18:10:54.980 回答