c ++:没有匹配的函数调用,特别是它被声明为参数类型不匹配

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)

编译器不再抱怨它了.我想知道为什么这个错误被声明为参数不匹配错误?为什么编译器没有将内容复制为函数调用的参数,而是将它们作为引用传递?

Sha*_*our 5

如果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)