19

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

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

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

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

谢谢。

例子:

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

2 回答 2

16

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

没有办法“使这项工作”,我的建议是重命名私有函数。有没有必要有一个私人访问器?

于 2009-07-29T16:02:07.900 回答
4

const如果对象被声明为 is ,它只会选择版本const,否则它将选择非const版本(即使这会导致错误)。

这应该有效:

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

或这个:

A const& ra1 = a1;
cout << ra1.a() << endl;
于 2009-07-29T16:05:33.120 回答