byt*_*ean 1 c++ compiler-errors const mismatch
g ++编译抱怨:
error: no matching function for call to ‘AddressSpace::resolve(ClassOne&, ClassTwo*&, ClassThree&) const’
note: candidates are: bool AddressSpace::resolve(ClassOne&, ClassTwo*, ClassThreer) <near match>
Run Code Online (Sandbox Code Playgroud)
导致此错误的代码是
void Class::handler(ClassOne& objOne, ClassTwo& objTwo,
ClassThreer objThree) {
obj.getAddressSpaceObj().resolve(objOne, objTwo.pointer, objThree);
}
Run Code Online (Sandbox Code Playgroud)
我深入研究代码,发现此错误是由返回的引用类型引起的getOtherObj()
.我让它在类定义中返回对AddressSpace对象的const引用,参见
const AddressSpace &getAddressSpaceObj(){
return addressSpace;
}
Run Code Online (Sandbox Code Playgroud)
我更改此定义后返回正常引用,
AddressSpace &getAddressSpaceObj(){
return addressSpace;
}
Run Code Online (Sandbox Code Playgroud)
编译器不再抱怨它了.我想知道为什么这个错误被声明为参数不匹配错误?为什么编译器没有将内容复制为函数调用的参数,而是将它们作为引用传递?
如果resolve
没有const
说明符,那么你就不能在const
引用上调用它,这样就可以将它更改为非const
,并且现在可以使用它.这是一个非常简单的例子:
#include <iostream>
class A
{
public:
void someFuncA() {};
void someFuncB() const {} ;
} ;
int main()
{
A
a1 ;
const A &aRef = a1 ;
a1.someFuncA() ;
// Below won't work because aRef is a const & but someFuncA() not const
//aRef.someFuncA() ;
// Below will work since someFuncB() is const
aRef.someFuncB() ;
}
Run Code Online (Sandbox Code Playgroud)
为了完整起见,如果你取消注释,aRef.someFuncA()
那么你将收到的错误将类似于:
19:19: error: no matching function for call to 'A::someFuncA() const'
19:19: note: candidate is:
6:12: note: void A::someFuncA() <near match>
Run Code Online (Sandbox Code Playgroud)