我有这个成员函数测试:
template <typename T>
struct has_member {
template <typename U> static true_type f(decltype(declval<U>().member()) *);
template <typename> static false_type f(...);
static const bool value = decltype(f<T>(0))::value;
};
当存在具有给定名称的成员函数时,如果函数具有不带参数的重载,则计算结果为true。对于这样的函数和STL容器,除了元素访问函数(正面,背面等)之外,它的工作正常,它总是评估为假。
为什么?我mingw g ++ 4.7。
答案 0 :(得分:6)
那是因为这些函数返回引用,并且您声明了一个指向返回值的指针,即指向引用的指针,这是不可能的。
快速修复将是:
template <typename U> static true_type
f(typename remove_reference< decltype(declval<U>().member()) >::type *);
PS :如果强制编译器在SFINAE失败时发出错误并且您认为不应该这样做,则可以(相对)轻松解决这些错误。
我的意思是,在您的代码中,只需注释掉false_type
,并在true_type
是唯一选项时查看编译器中的错误。在一系列无意义的界限之间有以下内容:
test.cpp:9:50: error: forming pointer to reference type
‘__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type& {aka int&}’