1

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>

导致此错误的代码是

void Class::handler(ClassOne& objOne, ClassTwo& objTwo,
        ClassThreer objThree) {

    obj.getAddressSpaceObj().resolve(objOne, objTwo.pointer, objThree);   
}

我深入研究了代码,发现这个错误是由getOtherObj(). 我让它在类定义中返回对 AddressSpace 对象的 const 引用,请参阅

const AddressSpace &getAddressSpaceObj(){
   return addressSpace;
}

在我更改此定义以返回正常引用后,

AddressSpace &getAddressSpaceObj(){
    return addressSpace;
}

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

4

1 回答 1

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() ;
}

为了完整起见,如果您取消注释,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>
于 2013-03-15T17:22:40.763 回答