我有一个简单的 SFINAE 场景来区分标准容器,例如std::map
:
template <typename Container> struct HasKeyType : sfinae_test { // (C)
template <typename U> static Yes test(typename Container::key_type*); // (A)
template <typename U> static No test(...);
enum {value = (sizeof(test(null)) == sizeof(Yes))}; // (B)
};
和
struct sfinae_test {
typedef char Yes;
typedef long No;
static void* const null;
};
当我用 实例化它时HasKeyType<std::vector<int> >::value
,我得到
(A) error: no type named ‘key_type’ in ‘class std::vector<int>’
(B) error: invalid use of incomplete type ‘struct HasKeyType<std::vector<int> >’
(C) error: declaration of ‘struct HasKeyType<std::vector<int> >’
我完全被难住了。为什么HasKeyType
不完整,为什么 SFINAE 不起作用?
如果我实例化实际上有一个键类型()(B)
,我也会得到类似的错误。(C)
HasKeyType<std::map<int,float> >
int
g++ 版本:4.5.2(是的,我知道它很旧)