我有一个这样的课程:
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;
非常感谢你的帮助。
=====
谢谢大家的解释和解决方案!非常感谢!
答案 0 :(得分:5)
返回值无法重载。当对象是非const时,将使用非const方法。可以通过以下方式指导编译器:
const vector<double>& test = const_cast<Foo const&>(foo).V();
或者可能更好的解决方案是使常量方法具有不同的名称(例如:ConstV
)。或者您可以添加此新方法并将当前方法保留在那里。此方法用于C ++ 0x标准。例如,常量方法cbegin()
和cend()
已添加到标准容器中。
答案 1 :(得分:5)
重载解析不考虑成员可访问性,因此选择理想的超载候选者并检查然后成员可访问性以查看该调用是否合法。
现实的解决方法是:
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;
答案 2 :(得分:2)
由于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;
答案 3 :(得分:1)
您接近解决方案。如果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;