首先解释为什么“template parameters not deducible”。
你的特化代码简化为
template <typename T> struct S<typename F<T>::type>;
那么给定一个实例化S<T0>,编译器如何推导T?相当于给定任意元函数F和类型T0,解方程 F(T) = T0,求T。
编译器没有这个功能。考虑到元函数是图灵完全的,这个任务从理论上就不可能。
编译器支持的是简单的模式匹配,例如T*=int**,求T。
至于你的第二个例子,首先特化版本少一个模板参数,它是特化是显然的。而这个模板参数T的推导也是显然的。enable_if不参与对T的推导,只在推导出T之后决定这个特化是否被排除。
反之,你第一个例子,两方面都不符合。
【 在 ComeAlong 的大作中提到: 】
: template <typename T>
: struct test_class2 : std::false_type {};
: template <typename T>
: ...................
--
修改:ilovecpp FROM 124.78.173.*
FROM 124.78.173.*