【发布时间】:2017-01-10 18:05:39
【问题描述】:
至少我认为下面的 sn-p 是 SFINAE 应用于专业化的一个尽可能简单的例子。
最后一行是重点,也是发生故障的地方。专门的foo 模板的定义决定了bar 模板的专门化,或者我想要的。其他 bar 特化可以在别处定义,或者可能不支持使用任意类型。
据我了解,广泛建议将相同的模式用于enable_if。
template <typename T>
struct foo;
template <>
struct foo<int> {
using type = int;
};
template <typename T, typename use = void>
struct bar;
template <typename T>
struct bar<T, typename foo<T>::type> {
using type = typename foo<T>::type;
};
using good = typename foo<int>::type;
using bad = typename bar<int>::type;
在 g++ 中,使用 14 或 17 标准,结果如下所示。似乎没有应用 bar 特化,编译器正在使用非特化(空)定义。为什么?
$ g++ --std=c++14 special.cpp -o special
special.cpp:18:32: error: ‘type’ in ‘struct bar<int>’ does not name a type
using bad = typename bar<int>::type;
【问题讨论】:
-
bar<int, foo<int>::type> <==> bar<int, int>bar<int, void> != bar<int, int> -
您正在实例化
bar<int, void>。为什么您希望编译器使用除“空”定义之外的任何其他内容?您对bar的“非空”特化甚至远程匹配<int, void>参数。
标签: c++ templates sfinae specialization