LINUX.ORG.RU

Не компилится макрос

 


0

1

В проекте на С++ есть объявление функции:

void EXPORT AnimateUntilDead( void );

Другая (инлайновая) функция вызывает предыдущую:

SetThink(AnimateUntilDead);

В свою очередь SetThink это макрос:

#define SetThink( a ) ThinkSet( static_cast <void (CBaseEntity::*)(void)> (a), #a )

Который по идее дает

ThinkSet(static_cast <void (CBaseEntity::*)(void)> AnimateUntilDead, "AnimateUntilDead")

Тем не менее в Студии 2019 получаем ошибку:

Error	C3867	'CSprite::AnimateUntilDead': non-standard syntax; use '&' to create a pointer to member

А в Студии 6.0 это компилится.

Пробовал добавлять & - не помогло:

SetThink(&AnimateUntilDead);
ThinkSet(
static_cast <void (CBaseEntity::*)(void)> (AnimateUntilDead), 
"AnimateUntilDead"
);

и вызывать без макроса, напрямую, тоже.



Последнее исправление: lvmuser (всего исправлений: 2)

Разбирайся что ты хочешь сделать.

А так компилятор всё правильно говорит. С какой радости свободная функция должна приводиться к указателю на член класса? Это звучит как адский бред…

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Это рабочий код из движка игры. Я просто пытаюсь скомпилить его свежими компиляторами.

А если предположить что существует CBaseEntity::AnimateUntilDead, то как можно получить на него ссылку по имени?

lvmuser
() автор топика

А в Студии 6.0 это компилится.

В студии 6 MS C++ — язык только отдалённо напоминающий ISO C++.

anonymous
()
Ответ на: комментарий от lvmuser

Это рабочий код из движка игры.

Если код не компилируется — он не рабочий.

anonymous
()
Ответ на: комментарий от fsb4000

С какой радости свободная функция должна приводиться к указателю на член класса?

Error C3867 'CSprite::AnimateUntilDead':...

свободная функция

Чёт кекнул с этой свободы.

anonymous
()

http://www.open-std.org/jtc1/sc22/wg21/docs/wp/html/jan96/expr.html#expr.unary.op (да, аж 96-й год)

3 A pointer to member is only formed when an explicit & is used and its operand is a qualified-id not enclosed in parentheses. [Note: that is, the expression &(qualified-id), where the qualified-id is enclosed in parentheses, does not form an expression of type «pointer to member.» Neither does qualified-id, because there is no implicit conver­sion from a qualified-id for a nonstatic member function to the type «pointer to member function» as there is from an lvalue of function type to the type «pointer to function» (conv.func). Nor is &unqual­ified-id a pointer to member, even within the scope of the unquali­fied-id’s class. ]

anonymous
()
Ответ на: комментарий от anonymous

Всем спасибо Так работает:

[code=cpp]ThinkSet( static_cast <void (CBaseEntity::*)(void)> (&CClassName::AnimateUntilDead), «AnimateUntilDead» );[/cpp]

Понадобилось только отыскать этот CClassName

lvmuser
() автор топика
Ответ на: комментарий от lvmuser

не за что, об этом написано в документации по ошибке компилятора, на первой странице гугла, первая ссылка на документацию, стоило только попросить, а ты на форум полез спрашивать, пока, больше не приходи.

anonymous
()
Ответ на: комментарий от anonymous

пока, больше не приходи

Присоединяюсь к приказу.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.