Компилятор 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;
}
компилятор больше не жалуется на это. Интересно, почему эта ошибка объявлена ошибкой несоответствия параметров? Почему компилятор не копировал контент как параметры вызова функции, а передавал их как ссылки?
Если 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>
Других решений пока нет …