为什么我无法访问具有受保护重载的公共函数?
Why can't I access a public function that has a protected overload?
给定代码:
class Foo
{
public:
Foo() {}
int foo() const { return 6; }
protected:
int foo() { return 5; }
};
int main(int argc, char* argv[])
{
Foo foo;
foo.foo();
return 0;
}
我得到一个编译错误:
"Foo::Foo":无法访问类"Foo"中声明的受保护成员
在实际使用中,我试图提供一个函数,该函数返回一个指向类正在存储的对象的指针——对于成员是可修改的,对于其他所有人是const。我想如果我说
const Item *i = foo.foo();
在非成员函数中,将调用正确的const变量。尽管如此,编译器还是坚持访问受保护部分中的非常量变量。知道为什么吗?谢谢
您的变量是非常数,因此会选择函数的非常数重载发生过载解决后,然后检查可访问性。
当const和非常量函数都存在时,只在const对象上调用const版本。您的foo
变量不是常量。如果需要,您可以使用const_cast
使常量:
const_cast<Foo const&>(foo).foo();
不过,使用起来很麻烦。一个更好的解决方案是给内部函数一个不同的名称,这样它就不会与外部API冲突。
对于非const
对象,如果两者都存在,则选择非const
函数重载而不是const
函数。
foo
的类型是Foo
而不是const Foo
,这就是编译器选择非const
的protected
版本的原因。
代码将以3种方式编译:
- 要么,在
public
中生成Foo::foo()
- 或者,使用
const Foo
,以便编译器选择正确的常量版本 - 删除非
const
版本
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?