C++ 类的Friend函数产生错误:“0”;否'___';声明的成员函数";

C++ 类的Friend函数产生错误:“0”;否'___';声明的成员函数";,c++,friend,access-control,friend-function,C++,Friend,Access Control,Friend Function,我有一个类,我正在尝试创建一个friend函数来操作该类的数据 下面是我正在尝试做的一个例子: // test.hpp class test { public: friend void friendly_function(); private: int data; }; void test::friendly_function() { data = 0; } 但是,编译器抛出了一个错误:test.hpp:23:34:错误:没有在类“test”中声明的“void tes

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

下面是我正在尝试做的一个例子:

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

void test::friendly_function()
{
    data = 0;
}
但是,编译器抛出了一个错误:
test.hpp:23:34:错误:没有在类“test”中声明的“void test::friendly_function()”成员函数。

我知道我可以这样声明运算符,如下所示:

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);
}
类测试
{
公众:

friend const bool operator在我发布这个问题之前,我实际上已经解决了这个问题,因此给出答案似乎是明智的,因为其他人可能会发现它在将来很有用。我还将答案设置为“社区维基”,以便其他人可以根据自己的意愿进行改进

问题是友元函数不是类的成员,因此必须在不使用
测试::
说明符的情况下进行编码,因为它们不是
类测试的成员

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

由于
friendly\u function()
不是
class test
的成员,因此最好将所有这些代码放在一个名称空间中,将所有函数和类分组到一个逻辑块中

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
名称空间测试{
课堂测试
{
公众:
友好函数(测试和测试);

朋友bool operatorI知道有人问过这个问题(在这一大堆问题中的某个地方),但你真的不必让它CW。这是一个布局良好的答案,如果你想解决自己的问题并想帮助他人,那么获得rep回答也很好。这没有编译。我仍然得到一个
错误:“data”没有在此范围内声明。
@chris我不明白。它是由同一个人错误地提出和回答的立即打开。
friendly_function
可以访问私人成员,但它需要OBJECT才能在非静态成员上访问。这有什么帮助吗?@PetrBudnik,对不起,我正在详细说明答案的布局,略读了一下内容,得到了+1分,并且他们似乎已经解决了问题作为一个指示,它是正确的。我明白你的意思,这是一个简单的解决方案。我将把它添加进来。“克里斯,我不怀疑你的C++专业知识。我看到你写的东西。事实上,我认为我甚至没有资格质疑它。如果你写了一个关于使用<代码>朋友<代码>的好评论,引用标准等。我会用两小时来投票。甚至没有读过它,我就知道它会是一个彻底而有用的函数。但我觉得这个问题只是问
当你把操作符作为朋友使用时,它们与函数在特定方面是否不同,并且胜利地宣布
否!
。为什么它们应该这样做?比如说,为什么
朋友
声明出现在
public
中>部分?这是误导,好像它应该在那里。。。