为什么g ++ 4.9尝试编译多余的代码?

时间:2016-01-04 20:06:02

标签: c++ c++11 g++ g++4.9

我尝试编译使用许多模板魔法(主要是元组)的旧代码(json到struct解析器),让我有可能像这样描述解析器命令:

auto mesh_parser = TupleParser<Mesh&>::create("Mesh list parser");
mesh_parser >> Ops::read("name") >> Ops::cast(&stringNotEmpty) >> Ops::write(&Mesh::name);
mesh_parser >> Ops::read("file") >> Ops::cast(&stringNotEmpty) >> Ops::write(&Mesh::file);
mesh_parser >> Ops::optional() >> Ops::read("submeshes") >> Ops::unlist() >> Ops::cast(&stringNotEmpty) >> Ops::write(&Mesh::submeshes);

此代码构建解析器链以将json(Qt库中的QJsonValue对象)解包为纯结构。

  • 阅读&#34;姓名&#34;属性,强制转换为QString(仅非空,或在其他地方失败),写入&#34; name&#34; property(QString);
  • 阅读&#34;姓名&#34;属性,强制转换为QString(仅非空,或在其他地方失败),写入&#34; name&#34; property(QString);
  • 如果可能,请阅读&#34;子网格&#34;,取消列表(对数组中的每个项目执行),强制转换(每个项目)为非空QString并将(每个项目)追加到&#34; submeshres&#34 ; property(QList)。

比解析:

Mesh output;
mesh_list_parser->parse(output, json_value);

// where json_value is QJsonValue with something like that:
// {"name":"foo","file":"bar.json","submeshes":["foo","bar","baz"]}

有时候这段代码很完美,但是g ++ 4.9尝试在我的代码中没有使用的变体中构建模板。

错误:

In file included from ../../Project/src/Render/meshmanager.cpp:4:0:
../../Project/src/Parse/tupleparser.h: In instantiation of 'struct _helpers::packer<Mesh&, QJsonValue>':
../../Project/src/Render/meshmanager.cpp:69:88:   required from here
../../Project/src/Parse/tupleparser.h:1144:38: error: creating pointer to member reference type 'Mesh&'
    using Field = FieldType Unref::*;

仅在调试和发布版本配置中Ops::castOps::write(以及另外两个命令 - one_ofor_else)的首次使用时引发此错误。< / p>

Ops - 具有解析器操作的命名空间。 Ops::cast_helpers::caster模板返回对象。该对象存储指向cast函数的指针。

我有操作员使用强制助手:

template<...> ParserNode<%output_tuple_type%> operator >>(ParserNode<%input_tuple_type&>, _helpers::caster<From, To> cmd)

此运算符将新命令(在本例中为cast)附加到解析链并返回新节点,但是......我不使用Ops::packer(从{{1返回对象)有错误的行上的模板),因此对于具有此类元组类型的节点,无需为_helpers::packer构建operator >>。每个运算符都是独立编写的,而不是Ops::packer模板类主体,所以我希望ParserNode只构建所需的组合。

Qt项目文件中的这一行:

g++

修复了问题(g ++ 4.8可以构建我的代码),但这就像走路拐杖一样。

我可以设置一些额外的g ++参数(到QMAKE_CXX=g++-4.8 )以防止构建未使用的模板组合吗?不想重写这段代码,至少现在......

0 个答案:

没有答案