tôi có mã:Chuyên tham số mẫu mẫu biến thể trên số lượng đối số tối thiểu: hợp pháp hay không?
#include <cstdio>
template<template<typename...> class>
struct Foo
{
enum { n = 77 };
};
template<template<typename, typename...> class C>
struct Foo<C>
{
enum { n = 99 };
};
template<typename...> struct A { };
template<typename, typename...> struct B { };
int main(int, char**)
{
printf("%d\n", Foo<A>::n);
printf("%d\n", Foo<B>::n);
}
Ý tưởng là template<typename, typename...> class
là một tập hợp con của template<typename...> class
, vì vậy nó có thể là có thể chuyên về nó. Nhưng nó khá bí truyền, vì vậy có lẽ không. Hãy thử nó đi.
GCC 4.7 nói:
$ g++ -std=c++11 test157.cpp
Nó biên soạn!
Chạy nó:
$ ./a.out
77
99
Nó hoạt động!
Clang 3.1 nói:
$ clang++ -std=c++11 test157.cpp
test157.cpp:10:8: error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
struct Foo<C>
^~~~
test157.cpp:9:10: error: too many template parameters in template template parameter redeclaration
template<template<typename, typename...> class C>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test157.cpp:3:10: note: previous template template parameter is here
template<template<typename...> class>
^~~~~~~~~~~~~~~~~~~~~
2 errors generated.
Ai đúng?
Cảm ơn bạn. Ví dụ hấp dẫn. Nghĩ về nó, ví dụ của tôi chỉ là một trường hợp cụ thể của một ví dụ chung về việc chuyên tham số mẫu mẫu biến thể cho bất kỳ số tham số cụ thể nào hơn (ví dụ, hai tham số). Nếu tôi cố gắng để thực hiện một chuyên môn của 'Foo' cho' template class' Tôi nhận được cùng một hành vi: GCC chấp nhận, Clang từ chối. Tôi sẽ gửi một lỗi (nếu nó chưa được thực hiện). Một trích dẫn từ tiêu chuẩn sẽ làm cho tôi hạnh phúc, nếu nó không phải là quá nhiều rắc rối. –
glaebhoerl