类的朋友函数产生错误:“no'___'成员函数声明”

时间:2013-08-29 20:43:47

标签: c++ friend access-control friend-function

我有一个类,我正在尝试创建一个友元函数来操作该类的数据。

这是我想要做的一个例子:

// test.hpp
class test
{
public:
    friend void friendly_function();
private:
    int data;
};

void test::friendly_function()
{
    data = 0;
}

但是,编译器会发出错误:test.hpp:23:34: error: no ‘void test::friendly_function()’ member function declared in class ‘test’

我知道我可以用这种方式声明运算符,如下所示:

class test
{
public:
    friend const bool operator<(const test& _lhs, const test& _rhs);
private:
    int data;
};

const bool test::operator<(const test& _lhs, const test& _rhs)
{
    return (_lhs.data < _rhs.data);
}

那么为什么我不能用friendly_function做到这一点?朋友的功能是否只允许作为运营商使用?

1 个答案:

答案 0 :(得分:2)

在我发布这个问题之前,我确实找到了问题,所以给出答案似乎是明智的,因为其他人可能会发现它有用。我也设置了“社区维基”的答案,所以其他人如果愿意可以改进它。

问题是,友元函数不是类的成员,因此必须在没有test::说明符的情况下进行编码,因为它们不是class test的成员。

声明friend void friendly_function();必须在测试类中,因为这告诉编译器允许friendly_function()访问test的私有成员。

由于friendly_function()不是class test的成员,因此将所有这些代码放在命名空间中是个好主意,命名空间将所有函数和类组合在一个逻辑块中。< / p>

namespace test_ns {
    class test
    {
    public:
        friend void friendly_function(test &_t);
        friend bool operator<(const test& _lhs, const test& _rhs);
    private:
        int data;
    }; // class test

    void friendly_function(test &_t)
    {
        _t.data = 0;
    }

    bool operator<(const test& _lhs, const test& _rhs)
    {
        return _lhs.data < _rhs.data;
    }

} // namespace test_ns

那应该解决问题。朋友的功能有点微妙,因为它们可能看起来像成员函数,但实际上并非如此!