不同指针类型之间的无效比较:'type*' 和 'type n(*)()'

Posted

技术标签:

【中文标题】不同指针类型之间的无效比较:\'type*\' 和 \'type n(*)()\'【英文标题】:invalid comparison between distintc pointer types: 'type*' and 'type&(*)()'不同指针类型之间的无效比较:'type*' 和 'type n(*)()' 【发布时间】:2017-06-06 16:00:50 【问题描述】:

我不明白为什么编译器会抱怨不正确的比较尝试。

有问题的比较是这样的:

method(const APFloat& V) 
...
    if (&V.getSemantics() == &APFloat::IEEEdouble) 
        ...
    
...

这里是比较项目的类型声明:

const fltSemantics &getSemantics() const;
static const fltSemantics &IEEEdouble();

编译器提示的错误如下:

不同指针类型 'const llvm::fltSemantics*' 和 'const llvm::fltSemantics& (*)()' 之间的比较缺少强制转换 [-fpermissive]

谁能帮我理解这个?我是初学者,但在我看来,比较中的两个术语都是 const fltsemantics && 类型。

PS:我正在编译 gcc 和 C++11 合规性。

【问题讨论】:

您在&APFloat::IEEEdouble 之后缺少(),因此您将指向fltSemantics 的指针与函数指针进行比较 另外,根据this,函数按值返回,而不是引用。 谢谢两位。我不能因为我对基本概念缺乏理解而责怪代码,但是这段代码不是我的。我认为这是在 API 完全不同时编写的旧 LLVM 代码。我现在正在尝试针对最新的 LLVM 版本之一编译它,并且有很多这样的错误。 【参考方案1】:

在我看来,比较中的两个术语都是 const fltsemantics && 类型。

没有fltsemantics&&这样的类型,所以两个表达式都不能有这样的类型。

V.getSemantics()

这是一个函数调用(函数调用)。我们知道这是一个调用,因为参数列表()。表达式的类型是fltSemantics&,因为这是函数返回的内容。

&V.getSemantics()

当应用于引用时,addressof 操作符返回一个指向被引用对象的指针。所以,addressof 表达式的类型是fltSemantics*

APFloat::IEEEdouble

这是一个函数的名称。没有函数调用,因为没有参数列表。函数类型为type&()

&APFloat::IEEEdouble

当应用于函数名时,addressof 运算符返回一个函数指针。本例中函数指针的类型为type&(*)()


我怀疑您打算调用这两个函数并比较返回值。要调用APFloat::IEEEdouble,您需要(空)参数列表:

APFloat::IEEEdouble()

【讨论】:

您的回答让我意识到我对引用和 addressOf 运算符的工作方式存在严重误解。谢谢! 还有其他一些事情:/【参考方案2】:

您正在将对象指针与函数指针进行比较,修复:

method(const APFloat& V) 
...
    if (&V.getSemantics() == &APFloat::IEEEdouble()) 
        ...
    
...

【讨论】:

谢谢!看起来我还不太了解引用是如何工作的,除其他外:)【参考方案3】:

&APFloat::IEEEdouble 计算为指向函数的指针,而&V.getSemantics() 计算为指向const llvm::fltSemantics* 的指针。这就是为什么你不能比较它们。

你可以使用:

if (&V.getSemantics() == &APFloat::IEEEdouble()) 

通过编译器。然而,这似乎不对。您可能想要比较函数返回的值,而不是指向这些值的指针。在这种情况下,您需要使用:

if (V.getSemantics() == APFloat::IEEEdouble()) 

【讨论】:

非常感谢。你的回答很清楚,但我决定选择另一个只是因为它更详细。 关于“看起来不正确”......确实。这不是我的代码,我只是想让它编译以便开始调试它并掌握它的工作原理。 @AmazingWouldBeGreat但是,不用担心。重要的是您能够理解问题并能够解决它。

以上是关于不同指针类型之间的无效比较:'type*' 和 'type n(*)()'的主要内容,如果未能解决你的问题,请参考以下文章

GO编程基础之四

模板参数无效(唯一指针)

Golang基础_03-数组Array

C++强制类型转换

在指向对象的不同类型的指针之间切换

共享内存 - 警告:指针和整数之间的比较