LINUX.ORG.RU

Преобразование типов [C++][namespace][class]

 , ,


0

1

Есть некая функция внутри класса, которая работает с другой функцией этого класса и передает её глобальной функции.
Проблема заключается в том, что передаваемая функция должна быть строга типа int(*)(void*), но она наследует пространство имен класса и тем самым не совпадает с типом аргумента принимающий функции. (К коду в данный момент нет доступа, будет только пример)

.h

class ClassA
{
ClassA()
{}
~ClassA()
{}

int foo1();

int foo2(void *);

}

.cpp

int foo2(void * Data)
{
/*....................................................*/
}

int foo1()
{
int err;
err=foo3(foo2,NULL); /*Здесь пишет что хочет int(*)(void *) а ему дают ClassA::int(*)(void *)*/
/*.....................................*/
return err;
}
Изменить foo3 не представляется возможным

Спасибо!

★★★★★

Последнее исправление: deterok (всего исправлений: 4)
  • .h
    class ClassA { 
    
        ClassA() {} 
        ~ClassA {}
    
        int foo1();
        int foo2(void *);
    
    } 
  • .cpp
    int foo2(void * Data) {
        /*....................................................*/ 
    }
    
    int foo1() { 
        int err; 
        err=foo3(foo2,NULL); 
        /*Здесь пишет что хочет int(*)(void *) а ему дают ClassA::int(*)(void *)*/ 
        /*.....................................*/ 
        return err; 
    } 
shty ★★★★★
()

нестатическая функция-член имеет тип отличный от типа свободной функции с той же сигнатурой уже хотя бы потому, что имеет дополнительный неявный параметр this. проблема совсем не в пространстве имён

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

под виндой всё собирается нормально, в том числе и под mingw )

foo3 описал как:

int foo3(int(*)(void*), void*) {
        return 0;
}

//чтобы не морочиться с хедерами/цепэпэ засунул все исходники в main.cpp, но дело не должно быть в этом, вроде

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

foo3 как бы сказать не моя и за нее вообще другой человек отвечает, у меня только модуль

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

а уберите ClassA - заработает? :)

//есть мнение что класс тут ни при чём

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

Выбивает ошибку, ну, как-то так звучащую
аргумент типа ‘int (ClassA::)(void*)’ не соответствует типу ‘int (*)(void*)

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

меня что, забанили все участники данного обсуждения?

у меня 0 игнорируемых :) Ваши сообщения видел, ничего добавить к ним не могу, т.к. согласен

//хочу понять что делает ТС чтобы получить данную ситуацию

shty ★★★★★
()
Ответ на: комментарий от shty
int foo4(void * Data)//Функция вне класса 
{ /*....................................................*/ }

int foo1() 
{ int err; err=foo3(foo4,NULL); /*.....................................*/ 
return err; }

Такая конструкция работала, смогу что либо попробовать изменить только завтра, когда до дома доберусь

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

Но только я не могу из foo4 вызвать ClassA::foo3 (естественно)

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

>нестатическая функция-член имеет тип отличный от типа свободной функции с той же сигнатурой уже хотя бы потому, что имеет дополнительный неявный параметр this

Причём это уже вторая такая тема за последние день-два :) Тенденция

yoghurt ★★★★★
()

Сделайте функцию-друга, которая будет обёрткой.

DELIRIUM ☆☆☆☆☆
()

Если ничего менять нельзя, то единственный правильный ответ такой:

int classa_foo_wrapper(void * self)
{
    return ((ClassA*)self)->foo2(0);
}

....
err=foo3(classa_foo_wrapper, a_obj);
Reset ★★★★★
()

чйрт, читаю тред и нахожусь в щоке, ТС следующий раз высказывай свои желания потаённые как-нибудь более явно

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

Вроде работает! А не могли бы вы объяснить, что происходит когда я передаю NULL в a_obj и чем это черевато

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

Уже понял :)
Спасибо всем за помощь

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