不同指针类型之间的无效比较:'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(*)()'的主要内容,如果未能解决你的问题,请参考以下文章