问题描述
class Foo {
// friend Bar;
public: const std::list<int*>& numbs () const { // (1)
return mNumbs;
}
protected: std::list<int*>& numbs () { // (2)
return mNumbs;
}
private: std::list<int*> mNumbs;
};
int main () {
Foo foo;
for (const auto& e : foo.numbs()) { // (3)
// some work...
}
}
我的意图是强制对客户使用(1)方法,对Foo类的朋友使用(2)方法。 但是,编译器尝试使用for语句中受保护的(2)方法,并且发生错误(3):
std::__cxx11::list<int*>& Foo::numbs()’ is protected within this context
我找到了一些解决方案:
有人知道更好的主意吗?
解决方法
方法1不是更好的匹配,因为foo
不是常量对象。仅当您的对象恒定时才调用它。
如果您的呼叫者选择将对象标记为const
,则错误将消失。例如,这将按预期工作:
const Foo foo;
for (const auto& e : foo.numbs()) { // (3)
// some work...
}
像这样的imo设计它似乎是一个坏主意。
另一方面,您还需要知道C ++的可见性和可访问性是不同的。两种方法都是可见的,但是只有一种可以访问。而且,在类型或派生类型之外无法访问更匹配的一个。因此是错误。
P.S .:如评论中所述,const_cast<>
也将达到相同的效果。