2009-11-26 18 views
8

Rozważmy następujący kod:Nie mogę uzyskać dostępu do wskaźnika do członka. Czemu?

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 

Dlaczego kompilator wygeneruje błąd? (VS2008)


New

Pisałem ten błąd do connect.microsoft.com.

+1

Co kompilatora używasz? Nie ma błędów w g ++ 4.3.3. – sth

+0

Jaki jest błąd zwrócony przez kompilator? – luc

+2

Nie mogę zrozumieć deklaracji szablonu "Y". Parametry szablonu to typy lub wartości integralne. "TF :: * m" nie jest typem, za pomocą którego można parametryzować szablon ... Podczas pisania "Y ", ostatni parametr nie jest typem, a nie wartość integralna. Jest wskaźnikiem do członka. Tak wiec, wierzę, to musi zostać odrzucone ... – SadSido

Odpowiedz

1

To bug

+1

To, co powiedziałem (http://stackoverflow.com/questions/1802204/i-can-not-get-access-to-pointer-to-member-why/1802365#1802365) –

7

Myślę, że jest to w jakiś sposób powiązane z tym, że Visual C++ nie zna wielkości wskaźnika do elementu w tym punkcie. Sprawdź na przykład raport o usterce this (inny problem ze wskaźnikiem na zmienną składową) (here). Myślę, że znalazłeś jeszcze jeden błąd Visual C++ i powinien zostać zgłoszony do connect.microsoft.com.

+0

Zbiegam się z teorią "błędu". Natknąłem się ostatnio na ten sam problem i znalazłem - ale nie pamiętam, gdzie - że jeszcze nie "w pełni poparli" argumentów klasy szablonu wskaźnika na wskaźnik. – xtofl

+0

Jednak kompilator nie musi znać zmiennej _size_, imho. – xtofl

+0

Mam na myśli, że 'sizeof (& Foo :: member)' może wynosić 1 lub więcej w zależności od deklaracji 'Foo'. –

0

Natknąłem się na ten sam problem. Obsługa argumentów szablonu wskaźnik-do-członka jest nadal ograniczona w VC++ (patrz bug report).

W moim przypadku mógłbym obejść go, używając funkcji szablonu i.s.o. klasa szablon:

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

Twój błąd nie jest związany z moim problemem. Działa dobrze bez błędów kompilatora. Używam VS2008. –

Powiązane problemy