私人非常规和公共const成员职能 - 和平共处?

时间:2009-07-29 15:59:10

标签: c++ compiler-errors

我正在尝试使用两个具有相同名称的方法创建一个类,用于访问私有成员。一种方法是public和const限定,另一种方法是private和non-const(由朋友类用于通过引用返回来修改成员)。

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

这看起来很奇怪,因为如果私有非const版本不存在,那么一切都编译得很好。

有没有办法让这项工作? 它是否在其他编译器上编译?

感谢。

示例:

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() */
}

2 个答案:

答案 0 :(得分:13)

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

没有办法“做这个工作”,我的建议是重命名私有功能。是否需要私人访问者?

答案 1 :(得分:3)

如果声明对象是const,它将只选择const版本,否则它将选择非const版本(即使这会导致错误)。< / p>

这应该有效:

cout << ((const A*)&a1)->a() << endl;

或者这个:

A const& ra1 = a1;
cout << ra1.a() << endl;