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 コンテナーの場合は、常に false と評価される要素アクセス関数 (front、back など) を除いて、適切に機能します。

何故ですか?私は 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 に答える