質問

次のコードを検討してください:

template<class T, class F>           struct X {};
template<class T, class F, T F::* m> struct Y {};

struct Foo {
    int member;
    typedef X<int, Foo>               x_type; // works well
    typedef Y<int, Foo, &Foo::member> y_type; // ERROR
};

typedef Y<int, Foo, &Foo::member> y_type2; // OK

コンパイラがエラーを生成する理由(VS2008)


新規

このバグを connect.microsoft.com

他のヒント

Visual C ++がその時点でのメンバーへのポインターのサイズを知らないことに何らかの関係があると思います。たとえば、 this 障害レポート(こちらは、メンバー変数へのポインターに関する別の問題です)。もう1つVisual C ++のバグが見つかったため、connect.microsoft.comに報告する必要があると思います。

同じ問題に出くわしました。メンバへのポインタテンプレート引数のサポートは、VC ++ではまだ制限されています(バグレポートを参照) 。

私の場合、テンプレート関数i.s.oを使用して回避できます。テンプレートクラス:

template< typename Class > struct CMemberDumper {
    Class& object;
    template< typename M > void visit_member( M C::*pm ) {
       std::cout << object.*pm;
    }
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top