I have a class like this :
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;
};
And then a piece of code like this :
Foo foo;
for(int i = 0; i < (int) foo.V().size(); ++i)
cout << foo.V().at(i) << endl;
However, the latter raises a compilation error saying the V()
call is a protected method while i am just trying to read from it, not modify it.
I have tried the following (but without success).
Foo foo;
const vector<double>& test = foo.V();
for(int i = 0; i < (int) test.size(); ++i)
cout << test.at(i) << endl;
Many thanks for your help.
=====
Thank you all for the explanations and solutions ! It's greatly appreciated !
It is not possible to overload on return value. Non-const method will be used when the object is non-const. It is possible to guide the compiler by:
const vector<double>& test = const_cast<Foo const&>(foo).V();
Or possibly nicer solution is to have the constant method have different name (eg.: ConstV
). Or you can just add this new method and leave the current method there. This approach is used in C++0x standard. For example constant methods cbegin()
and cend()
have been added to standard containers.