C2248:不能访问类中声明的私有成员
const and non const getter : C2248: cannot access private member declared in class
我有一个类实现了一个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重载将被选择,因为它有最佳匹配。
相关文章:
- 使用静态成员声明类时遇到问题
- 错误 C2059:语法错误:从结构成员声明'constant'
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- C++ 成员声明中不允许使用限定名称
- 又一个"未找到成员声明"
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++错误:成员声明末尾的预期“;”
- 静态成员声明 c++11
- 如何将成员声明为指向外部"C"函数的指针?
- C++11 - 将非静态数据成员声明为 'auto'
- 类成员声明的快捷方式
- libclang 获取成员声明
- 将成员声明与enable_if一起使用
- 找不到成员声明
- C++错误:找不到成员声明
- 找不到c++成员声明
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 将struct的成员声明为uint32_t时额外的字节
- 为什么类的大小取决于成员声明的顺序?以及如何
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许