2009-11-26 7 views
8

は、次のコードを考えてみましょう:メンバーへのポインタにアクセスできません。どうして?

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にこのバグを掲載しています。

+1

のですか? g ++ 4.3.3ではエラーはありません。 – sth

+0

コンパイラから返されるエラーは何ですか? – luc

+2

私は "Y"テンプレートの宣言を理解できません。テンプレートパラメータは、型または整数値のいずれかです。 "TF :: * m"は、テンプレートをパラメータ化できる型ではありません... "Y "と書くと、最後のパラメータは型ではなく型積分値。メンバーへのポインタです。したがって、私はそれを拒絶する必要があります... – SadSido

答えて

1

これは、あなたがどのようなコンパイラを使用しているbug

+1

私が言ったことは(http://stackoverflow.com/questions/1802204/i-can-not-get-access-to-pointer-to-member-why/1802365#1802365) –

7

どういうわけか、Visual C++はその時点でメンバへのポインタのサイズを知らないと思います。たとえば、this欠陥レポートをチェックしてください(hereは、メンバ変数へのポインタに関する別の問題です)。もう1つのVisual C++バグが見つかったと思います。それはconnect.microsoft.comに報告する必要があります。

+0

私は 'バグ'理論と一致します。私は最近、同じ問題を偶然発見したが、メンバーのテンプレートクラスの引数を完全にサポートしていないことが分かった。 – xtofl

+0

しかし、コンパイラは_size_、imhoを知る必要はありません。 – xtofl

+0

'sizeof(&Foo :: member)'が 'Foo'宣言によって1つ以上になることを意味します。 –

0

同じ問題が発生しました。 VC++では、ポインタからメンバへのテンプレート引数のサポートはまだ制限されています(bug report参照)。

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

template< typename Class > struct CMemberDumper { 
    Class& object; 
    template< typename M > void visit_member(M C::*pm) { 
     std::cout << object.*pm; 
    } 
}; 
+3

あなたのバグは私の問題とは関係ありません。コンパイラのエラーがなくてもうまく動作します。私はVS2008を使用します。 –

関連する問題