【发布时间】:2017-02-15 13:36:37
【问题描述】:
为什么这个结构不起作用?
Visual Studio 显示错误 C3201:类模板“AA”的模板参数列表与模板参数“C”的模板参数列表不匹配。但在这两种情况下似乎都是<int, char, bool>。
template<int I, char C, bool B>
struct AA
{
static const int i = I;
static const char c = C;
static const bool b = B;
};
template<typename... T>
struct outer
{
template <template<T... > typename C>
struct inner
{
template<T... X>
using type = C<X...>;
};
};
static_assert(outer<int, char, bool>::inner<AA>::type<5, 'a', true>::i == 5, "???");
添加:此外,编译器无法推断特殊化中的类型,例如
template<class T, template<T> class C, T X>
struct A<C<X>> { ... };
这些技巧是标准禁止的还是仅仅是编译器的限制?
【问题讨论】:
-
不会在 gcc 或 clang 上编译,fwiw。 clang 和 msvc 一样的错误,gcc 的不同,意义不大。
-
@Barry 在 clang 3.9.1 上运行,但在 clang 5.0 SVN 上没有
-
@TemplateRex 适合我思考更新 == 最佳 :)
-
@Barry 奇怪的是,这对所有直到 SVN ToT 的 clang 版本都有效(将 c++17 之前的
typename更改为class),但对于 g++ 来说从来没有/跨度>
标签: c++ templates variadic-templates template-templates