ошибки компилятора — c ++: нет соответствующего вызова функции, в частности, он объявлен как несоответствующий тип параметра

Компилятор 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 AddressSpace &getAddressSpaceObj(){
return addressSpace;
}

После того, как я изменил это определение, чтобы вернуть нормальную ссылку,

AddressSpace &getAddressSpaceObj(){
return addressSpace;
}

компилятор больше не жалуется на это. Интересно, почему эта ошибка объявлена ​​ошибкой несоответствия параметров? Почему компилятор не копировал контент как параметры вызова функции, а передавал их как ссылки?

1

Решение

Если 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>
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]