5

我有这个成员函数测试:

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。

4

1 回答 1

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&}’
于 2012-06-30T10:27:13.160 回答