2

我有一个可以工作的 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<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 相关的错误?

4

1 回答 1

1

在测试其他编译器后,这在 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 错误。

于 2016-09-03T13:53:38.517 回答