C++ C++;友元运算符重载不';不编译

C++ C++;友元运算符重载不';不编译,c++,C++,我有以下(简化的)类定义,它有编译错误 #include <iostream> #include <string> class number { public: friend std::ostream &operator << (std::ostream &s, const number &num); friend std::string &operator << (std:

我有以下(简化的)类定义,它有编译错误

#include <iostream>
#include <string>
class number
{
    public:
        friend std::ostream &operator << (std::ostream &s, const number &num);
        friend std::string  &operator << (std::string,     const number &num);
        friend std::istream &operator >> (std::istream &s,       number &num);
        friend std::string  &operator >> (std::string,           number &num);
    protected:
    private:
        void write (      std::ostream &output_target = std::cout) const;
        void read  (      std::istream &input_source  = std::cin);
        void to_string (      std::string &number_text) const;
        void to_number (const std::string &number_text);
};

std::istream & operator >> (std::istream &s,       number &num)
{
    num.read (s);
    return s;
}
std::string  & operator >> (std::string &s, number &num)
{
    num.to_number (s);
    return s;
}
std::string  & operator << (std::string &s, const number &num)
{
    num.to_string (s);
    return s;
}
std::ostream & operator << (std::ostream &s, const number &num)
{
    num.write (s);
    return s;
}
#包括
#包括
班号
{
公众:
friend std::ostream&operator(std::istream&s,number&num);
friend std::string和operator>>(std::string、number和num);
受保护的:
私人:
无效写入(std::ostream&output_target=std::cout)常量;
无效读取(std::istream&input_source=std::cin);
void to_string(std::string&number_text)常量;
无效到\u编号(常量标准::字符串和编号\u文本);
};
std::istream&operator>>(std::istream&s,编号和编号)
{
读取数;
返回s;
}
std::string和operator>>(std::string和s,number和num)
{
编号至_编号;
返回s;
}
std::string&运算符(std::string&,number&)':
frag.cpp:17:错误:“void number::to_number(const std::string&)”是私有的
frag.cpp:27:错误:在此上下文中

frag.cpp:在函数“std::string&operator中,函数签名不同:

    friend std::string  &operator << (std::string,     const number &num);
    friend std::string  &operator >> (std::string,           number &num);
两者都有一个
字符串&
参考参数。因此,您实际实现的函数与声明为
friend
的函数不同,因此出现了错误

尝试将好友声明更改为

    friend std::string  &operator << (std::string&,     const number &num);
    friend std::string  &operator >> (std::string&,           number &num);
friend std::string&operator>(std::string&,number&num);

péter Török得到了答案,但在试图阅读您的代码时,我陷入了语法垃圾和名称过于相似的纠结之中,我想这可能是困难的一部分。所以我做了:

s/std:://g
s/to_string/wilma/g
s/to_number/betty/g

这使得错误更加明显。

谢谢你们的帮助,先生们;头部/砖墙接口处有一点瘀伤。无论如何,感谢您的尝试。你可能已经猜到了,这是从一个更大的罪犯那里剪下来的。
    friend std::string  &operator << (std::string&,     const number &num);
    friend std::string  &operator >> (std::string&,           number &num);
s/std:://g
s/to_string/wilma/g
s/to_number/betty/g