使用非类型模板参数专门化模板模板参数

时间:2019-03-04 04:34:07

标签: c++ gcc g++ clang clang++

我正在尝试对类模板进行部分专业化处理,其中一个模板参数是包含单个非类型参数的模板模板参数。例如:

template <
    class T, 
    template <class Result, Result> class BinaryOperation
>
struct Foo;

template <
    template <class Result, Result> class BinaryOperation
>
struct Foo<
    int,
    BinaryOperation
>
{ };

此代码可使用GCC-4.9.2很好地编译。

但是,在使用Clang-4.0时,我收到了一条隐秘的错误消息:

$ clang++-4.0 test.cpp -o test -std=c++14 -stdlib=libc++ 
test.cpp:18:3: error: template template argument has different template parameters than its corresponding template template
      parameter
                BinaryOperation
                ^
test.cpp:14:33: note: template non-type parameter has a different type 'Result' in template argument
                template <class Result, Result> class BinaryOperation
                                              ^
test.cpp:9:33: note: previous non-type template parameter with type 'Result' is here
                template <class Result, Result> class BinaryOperation

我一直在搜索该错误消息,但是对我来说还不清楚。似乎是说Result在作为模板参数出现时与作为专门化列表的参数之一出现时被认为是不同的类型。

它可以在GCC-4.9.2上运行,所以我不知道这是否是Clang 4的问题,或者GCC-4.9.2是否允许它不应执行的操作。

那么Clang-4为什么报告此编译器错误?

1 个答案:

答案 0 :(得分:1)

在Clang bugzilla上报告了一个名为Alias template produces seemingly bogus "template template argument has different template parameters" error

的错误。

可以使用编译器选项-frelaxed-template-template-args在Clang 4中解决此错误。

请参见demo here

此问题已在更高版本的Clang(从5.0.0开始)中得到解决。