我无法理解为什么编译器会抱怨比较尝试不好。
违规的比较是这样的:
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合规性。
答案 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()) {