2009-11-26 2 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 - еще одна проблема с указателем на переменную-член). Я думаю, что вы обнаружили еще одну ошибку Visual C++, и ее следует сообщить на connect.microsoft.com.

+0

Я совпадаю с теорией «ошибок». В последнее время я наткнулся на ту же проблему и обнаружил - но не помню, где, - что они еще не «полностью поддерживали» аргументы класса шаблона-указателя. – xtofl

+0

Однако компилятору не нужно знать _size_, imho. – xtofl

+0

Я имею в виду, что 'sizeof (& Foo :: member)' может быть 1 или более в зависимости от декларации Foo. –

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. –

Смежные вопросы