Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无效的转换gcc-fpermissive_C++_Gcc_Gcc Warning - Fatal编程技术网

C++ 无效的转换gcc-fpermissive

C++ 无效的转换gcc-fpermissive,c++,gcc,gcc-warning,C++,Gcc,Gcc Warning,我的想法是检查这个dll是否有我需要的版本,或者它是旧的还是新的? 我正在尝试使用THUNK/蹦床功能 这是我在另一个*.dll文件中的用法。 int FilterVersion(CBaseFilter* pFilter) { //this is line 178 void* ProgVersion = (CBaseFilter::AbstractProgVersion)(void *)&CBaseFilter::FilterVersionStatic; return

我的想法是检查这个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);
}

这里的第一行是我的用法void*ProgVersion=(CBaseFilter::AbstractProgVersion)(void*)&CBaseFilter::FilterVersionStatic;在相关的源代码行中添加一条注释,以显示哪一行是第178行,这将有所帮助。您应该编辑您的问题以显示这一点。
void*
不保证能够存储函数指针。好的,我的想法是为动态加载DLL执行一个静态函数,以便在使用它之前检查文件/函数的版本。所以我试着在这里做一个蹦床的设计模式。这有什么原因吗?谢谢你的回答,我稍后会检查它,如果它有效的话,我会将它标记为正确的