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

时间:2013-03-15 17:19:23

标签: 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>

导致此错误的代码是

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

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

1 个答案:

答案 0 :(得分:5)

如果resolve没有const说明符,则您无法在const引用上调用它,因此这与将其更改为非{{1}一致并让它现在工作。这是一个非常简单的例子:

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