Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量和非常量getter:C2248:无法访问类中声明的私有成员_C++_Constants - Fatal编程技术网

C++ 常量和非常量getter:C2248:无法访问类中声明的私有成员

C++ 常量和非常量getter:C2248:无法访问类中声明的私有成员,c++,constants,C++,Constants,我有一个类,它实现了对std::vector的getter。派生类可以更改向量的内容,而任何其他类都可以读取它(或者在我的情况下复制),但不能更改它 使用VisualStudio2010进行SSCCE(但也应使用任何其他工具进行编译) 所以在基类中,我实现了如下getter: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <string> #in

我有一个类,它实现了对
std::vector
的getter。派生类可以更改向量的内容,而任何其他类都可以读取它(或者在我的情况下复制),但不能更改它

使用VisualStudio2010进行SSCCE(但也应使用任何其他工具进行编译)

所以在基类中,我实现了如下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;
}
我真的不明白这有什么错,为什么编译器不采用公共版本,即const,而是坚持使用非const

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

更新:
编辑了用于调用常量和非常量函数的SSCCE。

在这种情况下,它应该是

const Y y;
在调用函数的
const
版本的
Z::my_函数中。
或者直接强制转换到
常量
,如

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

您的案例不起作用,因为只有在重载解析后才会应用访问检查,因此将在调用中选择非常量重载,因为它具有最佳匹配。

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