转换gcc-fpermission无效

invalid conversion gcc -fpermissive

本文关键字:无效 gcc-fpermission 转换      更新时间:2023-10-16

我的想法是检查这个dll是否有我需要的版本,或者它是旧的还是新的?我正在尝试使用THUNK/蹦床功能。

这是我在另一个*.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

就我的搜索而言,我知道我错过了一个选角,但我不明白为什么?

我不确定你在这里想做什么,但这条线在很多方面都被打破了。(不,它与int *的任何强制转换无关。int *从哪里来?代码中没有int *。)

复杂转换序列中的最后一个转换是CBaseFilter::AbstractProgVersion类型,这是一种函数指针类型。但随后您尝试用它初始化void *变量。函数指针类型不能隐式转换为void *。这是你的错误。

如果你想用显式强制转换,你可以做

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

额外转换为CBaseFilter::AbstractProgVersion有什么意义?

但在任何情况下,void *都是一种数据指针类型,不应与函数指针类型混合使用。该语言不支持数据指针和函数指针之间的转换。整个方法被彻底破坏了。

事实上,你到底为什么要做这些转换?为什么不只是

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