distintc指针类型之间的无效比较:'type *'和'type&(*)()'

时间:2017-06-06 16:00:51

标签: c++ c++11 pointers reference

我无法理解为什么编译器会抱怨比较尝试不好。

违规的比较是这样的:

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合规性。

3 个答案:

答案 0 :(得分:1)

  

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

没有fltsemantics&&这样的类型,因此两个表达式都不能有这种类型。

V.getSemantics()

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

&V.getSemantics()

当应用于引用时,addressof运算符返回指向引用对象的指针。因此,表达式的地址类型为fltSemantics*

APFloat::IEEEdouble

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

&APFloat::IEEEdouble

当应用于函数名时,addressof运算符返回一个函数指针。在这种情况下,函数指针的类型为type&(*)()

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

APFloat::IEEEdouble()

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

您可以使用:

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

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

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