Мне нравится использовать решение на основе NOT EXIST
для этой проблемы:
SELECT id, rev
FROM YourTable t
WHERE NOT EXISTS (
SELECT * FROM YourTable t WHERE t.id = id AND rev > t.rev
)
Исправлены две ошибки:
int main()
{
golu m, *n;
void (golu::*t)() =&golu::man;
n=&m;
(n->*t)();
}
n->*t();
интерпретируется как (n->*(t()))
, пока вы хотите (n->*t)()
; 'void golu :: * t = & amp; golu :: man ();' следует изменить на «void (golu :: * t) () = & amp; golu :: man; ' вы пытаетесь использовать указатель на функцию, а не указатель на результат статической функции!
(1) Указатель функции не объявлен должным образом.
(2) Вы должны объявить следующее:
void (golu::*t) () = &golu::man;
(3) Указатель функции функции должен использоваться с объектом class
.
Указатель функции-члена имеет следующую форму:
R (C::*Name)(Args...)
Где R
- тип возврата, C
- тип класса, а Args...
- любые возможные параметры функции ( или нет).
С этим знанием ваш указатель должен выглядеть следующим образом:
void (golu::*t)() = &golu::man;
Обратите внимание на отсутствующий ()
после функции-члена. Это попытается вызвать указатель функции-члена, который вы только что получили, и это невозможно без объекта. Теперь это становится более читаемым с помощью простого typedef:
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
Наконец, вам не нужен указатель на объект для использования функций-членов, но вам нужна скобка:
golu m;
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
(m.*t)();
Скобки важны, поскольку оператор ()
(вызов функции) имеет более высокий приоритет (также называемый приоритет ), чем оператор .*
(и ->*
).