C2248:不能访问类中声明的私有成员

const and non const getter : C2248: cannot access private member declared in class

本文关键字:成员 声明 不能 访问 C2248      更新时间:2023-10-16

我有一个类实现了一个getter到std::vector。允许派生类更改vector的内容,而任何其他类都可以读取它(或者在我的例子中创建一个副本),但不能更改它。

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

在基类中我这样实现了getter

#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;
}

但是我得到了错误

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的公共版本,而是坚持使用非const。

即使我将变量更改为const &s(在这种情况下没有帮助),我仍然得到相同的错误。

更新:

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

在本例中应该是

const Y y;
Z::my_function中的

表示调用const版本的函数。生活或者直接转换为const Y,如

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

你的情况不工作,因为访问检查将只在重载解析后应用,在call y.getChilds()中,非const重载将被选择,因为它有最佳匹配。