Проблема GCC - неверное преобразование из 'void (*) (MyObject *, bool) "в" const void * " - PullRequest
1 голос
/ 29 апреля 2011

Я действительно не хочу, но я должен эмулировать логику COM в моей программе, и я использую стандартные макросы COM_ADDREF, но я получаю следующую ошибку: недопустимое преобразование из от 'void () (MyObject , bool) "до" const void * " ... Что мне делать?

#define COM_ADDREF(pObj, pMaster) ((pObj)->AddRef((pMaster), __FILE__, __LINE__, pObj))

class BaseComObject
{
public:
    inline DWORD AddRef (const void* pMaster, const char* pFileName, int line, const void* pObj) const
    {
        iRefCount++;
        return iRefCount;
    };

    inline DWORD GetRefCount() const
    {
        return iRefCount;
    };

private:
    long iRefCount;
};

class MyObject: public BaseComObject { };

void test (MyObject* pObject, bool bValue)
{
    if (pObject)
    {
        COM_ADDREF (pObject, bValue);// error: invalid conversion from 'void (*)(MyObject*, bool)' to 'const void*'
    }
}

ошибка: недопустимое преобразование из 'void () (MyObject , bool) "в" const void * "

ошибка: инициализация аргумента 1 'DWORD BaseComObject :: AddRef (const void *, const char *, int, const void *) const'

Ответы [ 4 ]

2 голосов
/ 29 апреля 2011

Мне не кажется, что это код, который генерирует эту ошибку. Когда я компилирую его с помощью g ++ (исправляя очевидные ошибки, такие как DWORD и изменяя состояние класса в функции const, он просто говорит мне, что не может найти соответствующую функцию.

Суть в том, что вы передаете bool в качестве второго аргумента COM_ADDREF, а функция базового класса AddRef действительно хочет void* в этой позиции параметра. Я очень подозреваю, что у вас есть класс с неявным конструктором bool, который вы нам не показываете, и это действительно сбивает с толку компилятор.

0 голосов
/ 29 апреля 2011

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

Ваш код делает очевидную попытку передать аргумент bool для параметра const void *, что действительно является ошибкой: вы передаете аргумент bool bValue как параметр const void* pMaster в AddRef. Но диагностическое сообщение об этой ошибке должно быть совершенно другим.

Полагаю, вы указали неправильный код.

Кстати, часть логики COM, которую вы пытаетесь эмулировать (по крайней мере, пока), называется подсчет ссылок . Он имеет свою ценность, не привязанную специально к COM. Вы можете найти довольно много примеров хорошо реализованного подсчета ссылок в C ++ в сети.

0 голосов
/ 29 апреля 2011

Указатели функций, такие как void ()(MyObject, bool), и указатели данных, такие как void *, не гарантируют одинакового размера (конечно, не по стандарту C; я полагаю, по стандарту C ++ тоже). POSIX предоставляет такую ​​гарантию, но языковые стандарты этого не делают.

Иногда вы можете обойти проблему с помощью объединения:

union DataFunction
{
    void  *data;
    void (*function)();
};

Вы можете назначить члену функции и считывать данные из члена данных, и хотя стандарт не гарантирует, что он будет работать, если только sizeof(void *) != sizeof(void (*)()), он будет работать на практике.

0 голосов
/ 29 апреля 2011

Публикуете ли вы тот же код, который вы скомпилировали?

Сообщение об ошибке «недопустимое преобразование из void (*)(MyObject*, bool) ...» явно относится к (адресу) функции void test (MyObject* pObject, bool bValue) в этом примере. Но вы не ссылаетесь на test в строке, в которой должна быть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...