c++ - 私有(private)非常量和公共(public) const 成员函数 - 和平共存?

标签 c++ compiler-errors

我正在尝试创建一个具有两个同名方法的类,用于访问私有(private)成员。一种方法是公共(public)的和 const 限定的,另一种是私有(private)的和非常量的(由 friend 类使用,通过引用返回的方式修改成员)。

不幸的是,我收到编译错误(使用 g++ 4.3):当使用非常量对象调用该方法时,g++ 提示我的方法的非常量版本是私有(private)的,即使是公共(public)(常量)版本存在。

这看起来很奇怪,因为如果私有(private)非常量版本不存在,一切都可以正常编译。

有什么办法可以使这个工作吗? 它可以在其他编译器上编译吗?

谢谢。

例子:

class A
{
public:
    A( int a = 0 ) : a_(a) {}
public:
    int   a() const { return a_; }
private:
    int & a()       { return a_; } /* Comment this out, everything works fine */
    friend class B;
private:
    int a_;
};


int main()
{
    A       a1;
    A const a2;

    cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails  */
    cout << a2.a() << endl; /* fine: uses the const version of a() */
}

最佳答案

重载解析发生在访问检查之前,因此当您在非常量 A 上调用 a 方法时,会选择非常量成员作为更好的匹配。然后编译器由于访问检查而失败。

没有办法“使这项工作”,我的建议是重命名私有(private)函数。是否需要私有(private)访问器?

关于c++ - 私有(private)非常量和公共(public) const 成员函数 - 和平共存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201295/

相关文章:

c++ - 从编译器的角度来看,传递 const 值或 const ref 之间的区别

c++ - 如何在 OpenCV 中读取 ".jpg"图像序列?

c++ - 这是 const_cast 的未定义行为吗?

java - NDK : keeping variables passed from java layer alive in c++ layer by copy by value

时间:2019-03-08 标签:c++binarysearchtreeinsert

sql - 我可以使用别名作为过滤器吗? T-SQL 2012

objective-c - 内联函数 "undefined symbols"错误

java - 当我在 Mac OX 10.10 上使用 IntelliJ IDEA 14 构建 scala 项目时出现问题

java - 错误 : The method add(java. lang.String) 未定义类型 java.lang.Object

asp.net - 我的ASP.NET项目出现很多错误。为什么?