C++ 我的SFINAE检查std::map/std::vector有什么问题?
我有一个简单的SFINAE场景来区分标准容器,如C++ 我的SFINAE检查std::map/std::vector有什么问题?,c++,sfinae,c++-standard-library,C++,Sfinae,C++ Standard Library,我有一个简单的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(...);
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)
};
当我用HasKeyType::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> >’
(A)错误:“class std::vector”中没有名为“key\u type”的类型
(B) 错误:不完整类型“struct HasKeyType”的使用无效
(C) 错误:“struct HasKeyType”的声明
我完全被这件事难住了。为什么HasKeyType
不完整,为什么SFINAE不工作
如果实例化实际上有一个键类型(int
)的HasKeyType
,我也会得到与(B)
和(C)
类似的错误
g++版本:4.5.2(是的,我知道它很旧)您在
测试方法中没有使用模板U
:
template <typename Container> struct HasKeyType : sfinae_test { // C
template <typename U> static Yes test(typename U::key_type* ); // A
template <typename U> static No test(U*);
enum {value = (sizeof(test<Container>(0)) == sizeof(Yes))}; // B
};
模板结构HasKeyType:sfinae_test{//C
模板静态是测试(typename U::key_type*);//A
模板静态无试验(U*);
枚举{value=(sizeof(test(0))==sizeof(Yes))};//B
};
注意,我将测试(null)
更改为测试(0)
。如果您的编译器支持它(GCC4.5不支持…),您可以使用nullptr
而不是0
哦,天哪,我一定是瞎了。我已经看了一个多小时了。谢谢4.5还不老!我必须每天使用2.95(针对我们的SPARC Sol-8客户)。
template <typename Container> struct HasKeyType : sfinae_test { // C
template <typename U> static Yes test(typename U::key_type* ); // A
template <typename U> static No test(U*);
enum {value = (sizeof(test<Container>(0)) == sizeof(Yes))}; // B
};