Я пытаюсь получить частичную специализацию шаблона класса, где один параметр шаблона является параметром шаблона шаблона, содержащим один параметр нетипичного типа.Например:
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 сообщает об этой ошибке компилятора?