gpt4 book ai didi

c++ - 无效转换 gcc -fpermissive

转载 作者:行者123 更新时间:2023-11-28 07:13:37 25 4
gpt4 key购买 nike

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

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

关于c++ - 无效转换 gcc -fpermissive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20586327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com