Virus |
Отправлено: 10.06.2006, 16:08 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 17
|
Объясняю ситуацию:
Есть два класса — FRM1 (форма) и С2 (просто класс).
В форме имеются две (необходимых для рассмотрения) функции — ff1 и ff2.
В классе — одна функция — cf1
CODE |
void FRM1::ff1(TObject* Sender)
{
C2 cls;
cls.cf1(ff2);
}
void FRM1::ff2(int i)
{
// ...
}
//...
void C2::cf1(void (* f)(int i))
{
// ...
int i=some_func(i);
// ...
f(i);
// ...
}
|
Теперь проблема:
При линковке выдвётся ошибка:
E2034 Cannot convert 'void (* (_closure )(int))(int)' to 'void (*)(int)'
и
E2342 Type mismatch in parameter 'f' (wanted 'void (*)(int)', got 'void')
на строку вызова функции cf1 в ff1.
Проблем не возникает, если функции находятся в одном классе или вообще не в классах.
P.S. Все эти функции PUBLIC. |
|
xTrim |
Отправлено: 10.06.2006, 19:59 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
CODE |
void C2::cf1(void (__closure* f)(int i))
{
|
Отредактировано xTrim — 10/06/2006, 23:00
|
|
ShibaOn |
Отправлено: 01.07.2006, 15:56 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 37
|
Насколько я знаю, имена функции-членов классов должны употребляться либо со скобками Пр: ff2() — вызов, либо с оператором взятия адреса Пр: &ff2, в то время, как взятие адреса глобальных функции происходит без знака амперсанда. Не знаю зачем было введено такое правило, но видимо это необходимость, так что попробуй:
CODE |
void FRM1::ff1(TObject* Sender)
{
C2 cls;
cls.cf1(&ff2);
}
|
|
|