存储在变量模板专业化中的Spirit-X3解析器不适用于Clang

TemplateRex

我有一个工作的Spirit-X3解析器,可以解析两个紧密相关的语法以设置草稿和检查器位置。我定义了两个变量模板专业化作为语法的两个方言的解析器:

// general variable template
template<class Format>
auto const position = []{};

// template specialization for algebraic notation (squares of the form "a1"-"h8")
template<>
auto const position<ast::ALG> = attribute_cast<ast::position<ast::ALG>> 
( 
    /* code depending on ast::ALG, omitted for brevity */
);

// template specialization for numeric notation (squares numbered 1 through N)  
template<>          
auto const position<ast::NUM> = attribute_cast<ast::position<ast::NUM>> 
( 
    /* code depending on ast::NUM, omitted for brevity */
);

这段代码可以在Clangg ++上编译并正确解析我的测试输入

由于这两个变量模板的特殊化取决于完全相同形式的template参数,因此我想将它们合并到一个通用变量模板中:

template<class Format>
auto const position = attribute_cast<ast::position<Format>> 
( 
    /* code depending on Format, omitted for brevity */
); 

这也可以正确编译和解析g ++它也可以为Clang编译,但是只能正确解析我在Wandbox上的输入,而不是在Coliru上的输入在我自己的开发盒中,使用来自apt.llvm.org的clang-3.8.0 ,我得到的错误行为与在Coliru上相同。

问题:Clang中的变量模板专业化是否存在错误?如何以与Wandbox相同的方式配置Clang,以解决该错误?还是某种与Spirit-X3相关的错误?

TemplateRex

在测试其他编译器之后,这会在Clang中出现一个可变模板代码生成错误,因为该代码正确地解析了g ++中的所有内容。

除了上面的显式专门化功能外,Clang还对尚未显式专门化的变量模板Spirit-X3解析器进行阻塞(即编译,但发出了无法解析输入的错误代码):

template<class Format>
auto piece_list = piece >> file >> rank;

template<>
auto const piece_list<ast::NUM> = piece >> square >> -('-' >> square);

此处的实时示例仅解析数字形式的位置字符串,并对所有代数字符串(未给出明确的专门化信息)进行错误处理。

并且仅在常规变量模板专用于将要调用的所有情况下才有效:

template<class Format>
auto piece_list = 0;

template<>
auto const piece_list<ast::ALG> = piece >> file >> rank;

template<>
auto const piece_list<ast::NUM> = piece >> square >> -('-' >> square);

我还没有找到一个小的简化的测试用例来隔离Clang错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板部分专业化不适用于typedef

来自分类Dev

Solr日期变量解析器不适用于MySql

来自分类Dev

Spirit X3解析器的启动状态?

来自分类Dev

Boost Spirit X3跳过解析器实现?

来自分类Dev

Boost Spirit X3跳过解析器实现?

来自分类Dev

模板情况下的编译器警告,应包含在模板专业化中

来自分类Dev

不同dll中的C ++模板专业化会产生链接器错误

来自分类Dev

模板化的函数专业化:链接器错误

来自分类Dev

模板化的函数专业化:链接器错误

来自分类Dev

从Boost Spirit X3解析器返回的向量中的空字符串

来自分类Dev

如何从Boost Spirit X3 lexeme解析器中获取字符串?

来自分类Dev

boost :: spirit :: x3中的通用解析器生成器

来自分类Dev

从Boost Spirit X3解析器返回的向量中的空字符串

来自分类Dev

模板专业化和DLL:Visual Studio与(GCC / Clang)

来自分类Dev

具有std :: string的文字类仅适用于模板专业化?

来自分类Dev

C ++编译器优化放弃模板专业化

来自分类Dev

STL容器的迭代器的模板专业化?

来自分类Dev

带有模板的构造器专业化

来自分类Dev

Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

来自分类Dev

Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

来自分类Dev

无法使用lambda参数编译boost :: spirit :: x3解析器

来自分类Dev

Boost Spirit X3:跳过无能为力的解析器

来自分类Dev

适用于DynamoDB的AWS AppSync解析器映射模板动态密钥

来自分类Dev

部分模板专业化可能不适用于函数,但是是否不重载同一件事?

来自分类Dev

如何用x3中的继承属性重写qi解析器?

来自分类Dev

puppet 3.8.x变量不适用于模板

来自分类Dev

Rust中的多个专业化迭代器模式

来自分类Dev

如何捕获由boost :: spirit :: x3解析器解析的值以在语义动作的主体内使用?

来自分类Dev

boost spirit X3解析器,可将偏移量转换为原始字符串

Related 相关文章

  1. 1

    模板部分专业化不适用于typedef

  2. 2

    Solr日期变量解析器不适用于MySql

  3. 3

    Spirit X3解析器的启动状态?

  4. 4

    Boost Spirit X3跳过解析器实现?

  5. 5

    Boost Spirit X3跳过解析器实现?

  6. 6

    模板情况下的编译器警告,应包含在模板专业化中

  7. 7

    不同dll中的C ++模板专业化会产生链接器错误

  8. 8

    模板化的函数专业化:链接器错误

  9. 9

    模板化的函数专业化:链接器错误

  10. 10

    从Boost Spirit X3解析器返回的向量中的空字符串

  11. 11

    如何从Boost Spirit X3 lexeme解析器中获取字符串?

  12. 12

    boost :: spirit :: x3中的通用解析器生成器

  13. 13

    从Boost Spirit X3解析器返回的向量中的空字符串

  14. 14

    模板专业化和DLL:Visual Studio与(GCC / Clang)

  15. 15

    具有std :: string的文字类仅适用于模板专业化?

  16. 16

    C ++编译器优化放弃模板专业化

  17. 17

    STL容器的迭代器的模板专业化?

  18. 18

    带有模板的构造器专业化

  19. 19

    Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

  20. 20

    Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

  21. 21

    无法使用lambda参数编译boost :: spirit :: x3解析器

  22. 22

    Boost Spirit X3:跳过无能为力的解析器

  23. 23

    适用于DynamoDB的AWS AppSync解析器映射模板动态密钥

  24. 24

    部分模板专业化可能不适用于函数,但是是否不重载同一件事?

  25. 25

    如何用x3中的继承属性重写qi解析器?

  26. 26

    puppet 3.8.x变量不适用于模板

  27. 27

    Rust中的多个专业化迭代器模式

  28. 28

    如何捕获由boost :: spirit :: x3解析器解析的值以在语义动作的主体内使用?

  29. 29

    boost spirit X3解析器,可将偏移量转换为原始字符串

热门标签

归档