我正在查看SFINAE的文档,并且有这个模板声明:
template<typename SomeType>
struct inner_type { typedef typename SomeType::type type; };
template <
class T,
class = typename T::type, // SFINAE failure if T has no member type
class U = typename inner_type<T>::type // hard error if T has no member type
// (guaranteed to not occur as of C++14)
> void foo(int) {}
具体来说,我问的是class = typename T::type
。宣布一个未命名的班级有什么意义?
由于评论,我认为当T
没有成员type
时,这会导致编译错误,但事实并非如此{{{ 1}}编译好。
另一方面
foo<int, int, int>(0);
如果template<class T, typename = std::enable_if_t<std::is_unsigned<T>::value>>
void foo(T t) {}
已签名则不编译,如果T
未签名则编译。
我在这里缺少什么?
答案 0 :(得分:3)
foo<int, int, int>(0);
编译得很好。
因为您指定了第二个模板参数,所以不会使用默认模板参数(即typename T::type
),因此不会触发编译错误。
如果您只是编写foo<int>(0);
来使用默认模板参数,则编译将失败。
你的第二个样本也是如此。
宣布一个未命名的班级有什么意义?
因为模板参数不会用于模板实现。