C++友元运算符重载无法编译

4

我有以下(简化版)类定义,但它存在编译错误。

#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;
}

当我编译它时,我会得到以下错误...
frag.cpp: In functionstd::string& operator>>(std::string&, number&)’:
frag.cpp:17: error: ‘void number::to_number(const std::string&)’ is private
frag.cpp:27: error: within this context
frag.cpp: In functionstd::string& operator<<(std::string&, const number&)’:
frag.cpp:16: error: ‘void number::to_string(std::string&) const’ is private
frag.cpp:32: error: within this context

有人能帮忙解决这个问题吗?特别是为什么 to_number 和 to_string 被认为是私有的,但 read 和 write 却可以使用?

谢谢。


谢谢您的帮助,先生们;在头部/砖墙接口处有一点挫伤正在发展。 - Brian Hooper
2个回答

5

函数签名不同:

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

在IT技术中,变量通常使用string参数按值声明,而

std::string  & operator >> (std::string &s, number &num) ...
std::string  & operator << (std::string &s, const number &num) ...

两者都有一个string&引用参数。所以你实际实现的函数与声明为friend的函数不同-因此会出现错误。

尝试将友元声明更改为

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

0
Péter Török得到了答案,但在尝试阅读您的代码时,我陷入了语法垃圾和名称过于相似的困境,这可能是困难的一部分。所以我做了:
s/std:://g
s/to_string/wilma/g
s/to_number/betty/g

这使得错误更加明显。


无论如何,感谢您的尝试。正如您所猜测的那样,这是从一个相当大的犯罪分子中剪辑出来的。 - Brian Hooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接