C ++受保护的/公共重载

|| 我有一个这样的课:
class Foo
{
public:
    Foo()
    {
        for(int i = 0; i < 10; ++i)
            v.push_back(i);
    };
    const vector<double>& V() const {return v;};
protected:
    vector<double>& V() {return v;};
private:
    vector<double> v;
};
然后是这样的一段代码:
Foo foo;
for(int i = 0; i < (int) foo.V().size(); ++i)
    cout << foo.V().at(i) << endl;
但是,后者引发了一个编译错误,说
V()
调用是受保护的方法,而我只是尝试从中读取而不是修改它。 我尝试了以下方法(但未成功)。
Foo foo;
const vector<double>& test = foo.V();
for(int i = 0; i < (int) test.size(); ++i)
    cout << test.at(i) << endl;
非常感谢您的帮助。 ===== 谢谢大家的解释和解决方案!非常感谢!     
已邀请:
返回值不能过载。当对象是非常量时,将使用非常量方法。可以通过以下方式指导编译器:
const vector<double>& test = const_cast<Foo const&>(foo).V();
也许更好的解决方案是使常量方法具有不同的名称(例如:
ConstV
)。或者,您可以仅添加此新方法,然后将当前方法保留在那里。此方法在C ++ 0x标准中使用。例如,常量方法
cbegin()
cend()
已添加到标准容器中。     
重载解析不考虑成员可访问性,因此选择了一个理想的重载候选者,然后检查成员可访问性以查看调用是否合法。 现实的解决方法是:
Foo foo;
Foo const& foo_alias = foo;
for (std::size_t i = 0; i != foo_alias.V().size(); ++i)
    cout << foo_alias.V().at(i) << endl;
    
由于
foo
不是
const
编译器正在尝试使用non-const方法。作为解决方法,您可以执行以下操作:
    Foo foo;
    const Foo& cFoo = foo;
    for(int i = 0; i < (int) cFoo.V().size(); ++i)
    cout << cFoo.V().at(i) << endl;
    
您已接近解决方案。如果Foo也是
const
,则编译器将选择
const
函数。
Foo foo;
const Foo& cfoo = foo; 

for(int i = 0; i < (int) cfoo.V().size(); ++i)
    cout << cfoo.V().at(i) << endl; 
    

要回复问题请先登录注册