2013-12-14 5 views
0

Моя идея - проверить, нужна ли этой DLL версия, которая мне нужна, или она старше или новее? Я пытаюсь использовать функцию THUNK/Trampoline.Неверное преобразование gcc -fpermissive

здесь мое использование в другом файле * .dll.

int FilterVersion(CBaseFilter* pFilter) 
{ 
//this is line 178 
    void* ProgVersion = (CBaseFilter::AbstractProgVersion)(void *)&CBaseFilter::FilterVersionStatic; 
    return (*(CBaseFilter::AbstractProgVersion)ProgVersion)(*pFilter); 
} 

Это объявление класса, в котором я объявил батут.

class PROG_CORE_API CBaseFilter 
{ 
friend class CProgEngineInternal; 

// Trampoline Design pattern 
// this FilterVersion function will be used on a global function exported from a 
// cpp file exporting the dlls functions (therfore must be: static = global). 
// it will use an arbitrary BaseFilter object - so Pure abstract function will 
// make it possible to use polimorphism to all types of derived classes objects. 

public: 

    typedef int (*AbstractProgVersion)(CBaseFilter&); 

    virtual int FilterVersionAbs() =0 ; 

    // a single spot (static) where all derived implemented filters versions tested. 
    // developer can specify version numbers to prohibit from running 
    // returning 0 should block the filter from loading. 

    static int FilterVersionStatic(CBaseFilter& FilterObj) 
    { 
     // version is 4 bytes 
     return FilterObj.FilterVersionAbs(); 
    } 

    mutable int m_Version; 

private:..... 

Предупреждение я получаю:

GCC Build Error in - AddBorders_F.cpp:178:76: error: invalid conversion from ‘CBaseFilter::AbstractProgVersion {aka int (*)(CBaseFilter&)}’ to ‘void*’ [-fpermissive] 
GCC Build Error in - AddBorders_F.o] Error 1 
GCC Build Error in - make: *** [AddBorders] Error 2 

, насколько мой поиск идет я понимаю, я не хватает кастинг на, но я не понимаю, почему?

+0

Где линия 178? – ldrumm

+0

Первая строка здесь - мое использование void * ProgVersion = (CBaseFilter :: AbstractProgVersion) (void *) & CBaseFilter :: FilterVersionStatic; – Gilad

+2

Это поможет добавить комментарий к соответствующей строке исходного кода, чтобы показать, какая строка 178. Вы должны изменить свой вопрос, чтобы показать это. – ldrumm

ответ

1

Я не уверен, что вы пытаетесь сделать здесь, но это то, что линия сломана в большей степени, чем одна. (И нет, это не имеет ничего общего с любыми слепков к int *. Где сделал int * даже пришел? Там нет int * где-нибудь в вашем коде.)

Последние преобразования в вашей замысловатой последовательности преобразования является CBaseFilter::AbstractProgVersion типа, который тип указателя функции. Но затем вы пытаетесь инициализировать переменную void *. Типы указателей функций неявно конвертируются в void *. Это твоя ошибка.

Если вы хотите, чтобы это преобразование с помощью явного приведения, вы можете сделать

void* ProgVersion = (void *) &CBaseFilter::FilterVersionStatic; 

Какой смысл этого дополнительного преобразования в CBaseFilter::AbstractProgVersion?

Но в любом случае void * - тип указателя данных, который не следует смешивать с типами указателей функций. Язык не поддерживает преобразования между указателями данных и указателями функций. Весь подход безнадежно нарушен.

На самом деле, почему на Земле вы даже делаете все эти преобразования? Почему не только

int FilterVersion(CBaseFilter* pFilter) 
{ 
    return CBaseFilter::FilterVersionStatic(*pFilter); 
} 
+0

ОК, моя идея - сделать статическую функцию для динамической загрузки DLL, чтобы проверить версию файла/функции перед ее использованием. поэтому я попытался создать шаблон батута. делает ли это какие-либо причины? – Gilad

+0

спасибо за ответ, я проверю его позже и отметю его как правую, если он работает – Gilad

Смежные вопросы