Нередко объявляются как константные, так и изменяемые варианты, например:
std::vector<int>& VectorHolder::getVector() {
return myVector;
}
const std::vector<int>& VectorHolder::getVector() const {
return myVector;
}
Основная проблема вашей программы заключается в том, что вы возвращаете неконстантную ссылку из метода const.
std::vector<int>& VectorHolder::getVector() const {
return myVector; // << error: return mutable reference from const method
}
так что вы можете сделать это с помощью этой формы:
const std::vector<int>& VectorHolder::getVector() const {
return myVector; // << ok
}
и когда это неконстантный метод или клиент содержит неконстантную ссылку, вы можете легально использовать неконстантный метод:
std::vector<int>& VectorHolder::getVector() {
return myVector; // << ok
}
наконец, вы можете вернуть значение (в некоторых случаях):
std::vector<int> VectorHolder::getVector() const {
return myVector; // << ok
}
потому что копия не требует мутации и не предоставляет доступа к внутренним данным.
так что в итоге вы будете часто объявлять оба варианта.
Результаты объявления обоих:
VectorHolder m;
const VectorHolder c;
m.getVector().size(); // << ok
c.getVector().size(); // << ok - no mutation
m.getVector().push_back(a); // << ok
c.getVector().push_back(a); // << error: attempt to mutate const reference because the const vector is returned
так что все работает хорошо (не считая избыточности методов).