2

エラーの性質は、このスレッドで言及されているものとは異なります。
クラスにメンバー(メソッド)が含まれているかどうかを確認する SFINAE 方法を VC++ 環境に実装しようとしています。

以下は、そのための単純化されたコードです。

template<typename Class>
class HasMember_Method
{
  typedef char (&yes)[2];

  template<unsigned int> struct Exists;

  template<typename V>
  static yes CheckMember (Exists<sizeof(&V::Method)>*);  // <--- VC++ problem
  template<typename>
  static char CheckMember (...);

public: 
  static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes));
};

これが私Methodたちが探しているメンバーメソッドです。このコードは、 C++11 がなくてもg++ 環境で完全に機能します。
ただし、同じ結果、バグのある VC++ のコンパイラ エラーが発生します。

エラー C2070: 'overloaded-function': 不正な sizeof オペランド

を使用して SFINAE の他の回避策を試しましdecltypeたが、うまくいきませんでした。この問題の修正またはより良い回避策はありますか?

4

1 に答える 1

2

以下は正しい答えではありませんが、少なくとも問題は解決します。コード スニペットで、次の 2 行を変更しました。

template<typename Class>
class HasMember_Method
{
  typedef char (&yes)[2];

  template<typename> struct Exists; // <--- changed

  template<typename V>
  static yes CheckMember (Exists<decltype(&V::Method)>*); // <--- changed (c++11)
  template<typename>
  static char CheckMember (...);

public: 
  static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes));
};

これにより、VS2010/12 でのコンパイルの問題が修正されます。

待つ!これにより、バグのある VC++ コンパイラの別の欠陥が明らかになりました。
結果は常に true になります。:(古き良き g++ はここでも問題なく動作
します。

したがって、正解は、Microsoft VC++ コンパイラ チームがこれらの問題を修正するのを待つことです。

于 2014-01-07T14:41:38.100 に答える