Перечитываю Джэфф Элджер "C++" (Jeff Alger C++ for real programmers). ISBN 5-8046-0045-1
Нашел песдатую штуку "Указатель на переменную класса" (стр 267). Следующий пример:
class Foo{
private:
int x;
public:
static int & Foo::*X() { return &Foo::x; }
};
Foo f = new Foo; // тут видать у него опечатка
int& Foo::*pm = Foo::X(); // вся магия нах. вычисляет смещение для int
int& i = f->*pm; // применяет смещение к экземпляру
полная магия нах. хочу такое сделать, но компиляторы вопят:
cannot declare pointer to 'int&'
ладно. читаю у него дальше: "Все эти int& можно заменить на int*" -
меняю - получаю:
test.cpp: In static member function 'static int* Test::* Test::X()':
test.cpp:5: error: cannot convert 'int Test::*' to 'int* Test::*' in
return
test.cpp: In function 'int main(int, char**)':
test.cpp:10: error: cannot declare pointer to 'int&'
** в общем хер с ним 5-ой строки уже хватает **
test.cpp:10: error: cannot convert 'int* Test::*' to 'int Test::*' in
initializa
tion
test.cpp:11: error: invalid conversion from 'int' to 'int*'
make: *** [all] Ошибка 1
------------------
мой пример в аттачменте, вообще у меня волосы дыбом лезут во первых
использовать Foo:: внутри class Foo:: - имхо это ж вообще лажа. Во
вторых интересно такое вообще можно сделать? ты сталкивался с такой
фиговиной?
пробовал несколько разных g++
Что это фантазии затуманеного чем-то мозга Джеффа? Опечатка или я туплю? Кто-нибудь сталкивался с таким? И что это за дикий синтаксис. (MSVC ругается после замены int& на int*:
test.cpp(5) : error C2440: 'return' : cannot convert from 'int Test::*' to 'int *Test::* '
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
test.cpp(10) : error C2636: '<Unknown>' : pointer to reference member is illegal
Не знаю, что хотел автор, но вот так правильно:
class Foo{
private:
int x;
public:
static int Foo::*X() { return &Foo::x; }
};
main()
{
Foo *f = new Foo;
int Foo::*pm = Foo::X();
int& i = f->*pm;
}