const和非const getter:C2248:无法访问类中声明的私有成员

时间:2015-10-20 09:43:12

标签: c++ const

我有一个实现#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <string> #include <vector> class X { public: inline std::vector<std::string> const &getChilds(void) const { return mChilds; } void mutateInternal(void) { mState != mState; } protected: inline std::vector<std::string> &getChilds(void) { return mChilds; } private: std::vector<std::string> mChilds; bool mState; }; // Now in the derived class class Y : public X { public: Y(void) { std::vector<std::string> &childs = getChilds(); childs.push_back("Test"); } }; // In the non derived class: class Z { public: void myfunction(void) { Y y; std::vector<std::string> s = y.getChilds(); if(s.size() == 0) y.mutateInternal(); } }; int main(int argc, char *argv[]) { return 0; } 的getter的类。允许派生类更改向量的内容,而任何其他类可以读取它(或在我的情况下复制),但不能更改它。

SSCCE与Visual Studio 2010(但也应与其他任何编译)。

所以在基类中我实现了这样的getter:

1>junk.cpp(49): error C2248: "X::getChilds": cannot access private member declared in class.
1>          junk.cpp(18): Siehe Deklaration von 'X::getChilds'
1>          junk.cpp(10): Siehe Deklaration von 'X'

但是我收到了错误

const &s

我并没有真正意识到这有什么问题以及编译器为什么不采用const的公共版本而是坚持使用非const。

即使我将变量更改为{{1}}(在这种情况下也没有帮助),我仍然会遇到同样的错误。

更新

编辑SSCCE以调用const和非const函数。

1 个答案:

答案 0 :(得分:4)

在这种情况下应该是

const Y y;

Z::my_function中,用于调用const版本的函数。 Live 或者只是转换为const Y,例如

std::vector<std::string> s = const_cast<const Y&>(y).getChilds();

您的情况不起作用,因为只有在重载解析后才会应用访问检查,因为它具有最佳匹配,所以会选择调用y.getChilds()非常量重载。