Специализировать параметр шаблона шаблона с нетипичным параметром шаблона - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь получить частичную специализацию шаблона класса, где один параметр шаблона является параметром шаблона шаблона, содержащим один параметр нетипичного типа.Например:

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 голосов
/ 04 марта 2019

Об ошибке сообщается в bugzilla Clang для этого заголовка: Шаблон псевдонима производит на первый взгляд фальшивый «аргумент шаблона шаблона имеет разные параметры шаблона» ошибка

Эта ошибка может быть устранена в Clang 4с опцией компилятора -frelaxed-template-template-args.

См. демо здесь .

Это было исправлено в более поздних версиях Clang (начиная с 5.0.0 и далее).

...