模板参数中未命名的类/类型名称

时间:2016-03-30 02:10:02

标签: c++ templates c++11 c++14 typename

我正在查看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未签名则编译。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

  

foo<int, int, int>(0);编译得很好。

因为您指定了第二个模板参数,所以不会使用默认模板参数(即typename T::type),因此不会触发编译错误。

如果您只是编写foo<int>(0);来使用默认模板参数,则编译将失败。

LIVE

你的第二个样本也是如此。

  

宣布一个未命名的班级有什么意义?

因为模板参数不会用于模板实现。