C++ 运算符重载问题

C++ 运算符重载问题,c++,operator-overloading,C++,Operator Overloading,我有朋友在一个类定义明显,为了让它更清楚,已经删除了实现代码等 class Ref { public: Ref(char* s, size_t l) : _s(s), _l(l) {} private: char* _s; size_t _l; }; class foo { public: friend stringstream& operator>>(std::stringstream

我有朋友在一个类定义明显,为了让它更清楚,已经删除了实现代码等

class Ref
{
    public:
        Ref(char* s, size_t l) : _s(s), _l(l) {}
    private:
        char* _s;
        size_t _l;
};

class foo
{
    public:
        friend stringstream& operator>>(std::stringstream& s, uint8_t& v) { return s; }
        friend stringstream& operator>>(std::stringstream& s, const Ref& r) { return s; }
    private:
        std::stringstream ss;
        void example(void)
        {
            char b[256];
            Ref r(b, sizeof(b));
            uint8_t i;

            ss >> i >> r;    <------ Why do I get an error here?
            ss >> r >> i;    <------ But this one seems to compile fine.
        }
};
class-Ref
{
公众:
Ref(char*s,size\u t l):\u s(s),\u l(l){
私人:
char*\u s;
尺寸;
};
福班
{
公众:
friend stringstream&operator>>(标准::stringstream&s,uint8_t&v){return s;}
friend stringstream&operator>>(std::stringstream&s,const Ref&r){return s;}
私人:
std::stringstream-ss;
void示例(void)
{
字符b[256];
参考文献r(b,尺寸f(b));
uint8_t i;

ss>>i>>r;>r>>i;为什么在
std::stringstream
上重载?您应该 在
std::istream
std::ostream
(取决于方向)。这种情况非常罕见 甚至会使用
std::stringstream
std::istringstream
std::ostringstream
通常更合适),以及 即使是这样,
操作员>>
通常也会返回 一个
std::istream&
,而不是
std::stringstream&

ss >> i >> r;   <-------  why do I get an error here?
编辑:

关于为什么一个似乎有效:

ss >> r >> i;

您已经定义了一个
操作符>>
,它接受
字符串流&
Ref const&
,因此内部调用是有效的
operator>
返回一个
stringstream&
,它是
std::istream
,因此函数
操作符>>(std::istream&,
可以调用unsigned char)
。其中:

ss >> i >> r;

内部调用返回一个
std::istream&
,并且没有 对于
std::istream&,Ref const&
,重载
运算符>

如上所述:重载的
>>
应始终
std::istream&
作为第一个参数,并返回
std::istream&
为什么在
std::stringstream
上重载?您应该
ss >> i >> r;   <-------  why do I get an error here?
std::istream
std::ostream
(取决于方向)。这种情况非常罕见 甚至会使用
std::stringstream
std::istringstream
std::ostringstream
通常更合适),以及 即使是这样,
操作员>>
通常也会返回 一个
std::istream&
,而不是
std::stringstream&

ss >> i >> r;   <-------  why do I get an error here?
编辑:

关于为什么一个似乎有效:

ss >> r >> i;

您已经定义了一个
操作符>>
,它接受
字符串流&
Ref const&
,因此内部调用是有效的
operator>
返回一个
stringstream&
,它是
std::istream
,因此函数
操作符>>(std::istream&,
可以调用unsigned char)
。其中:

ss >> i >> r;

内部调用返回一个
std::istream&
,并且没有 对于
std::istream&,Ref const&
,重载
运算符>

如上所述:重载的
>>
应始终
std::istream&
作为第一个参数,并返回
std::istream&

ss >> i >> r;   <-------  why do I get an error here?
如果您确实希望运算符执行任何有用的操作,则需要从第二个参数中删除
const


如果你真的想让操作符做任何有用的事情,那么你需要从第二个参数中删除
常量。

你说你的朋友在类定义中,但在你的代码中他们不在。你的语句或代码哪一个是对的?当询问错误时,总是包括完整的错误消息。更改
l(_l)
\u l(l)
,删除
friend
关键字(因为它们不能出现在类定义之外),并将
char*b[256]
更改为
char b[256]
,并将相关代码粘贴到
main()中
,这对我来说很好。@GuyGreer你确定吗?
ss>>i
的结果应该是
std::istream
类型,而
istream>>Ref
@JamesKanze没有
>
,他重载了(在全局命名空间中)
操作符>>
用于
uint8\u t
std::stringstream
返回
std::stringstream&
,编译器在
命名空间std
中的一个之前找到一个。但是,在编辑之后,现在不会编译,因为相同的重载现在在
类foo
中从未考虑过,并且通过ADL在
中找到了预期的一个。您说您的朋友在类定义中,但在您的代码中他们不在。哪一个是正确的,您的声明还是代码?当询问错误时,始终包括完整的错误消息。将
l(\u l)
更改为
\u l(l)后
,删除
friend
关键字(因为它们不能出现在类定义之外),并将
char*b[256]
更改为
char b[256]
并将相关代码粘贴在
main()中
,这对我来说很好。@GuyGreer你确定吗?
ss>>i
的结果应该是
std::istream
类型,而
istream>>Ref
@JamesKanze没有
>
,他重载了(在全局命名空间中)
操作符>>
用于
uint8\u t
std::stringstream
返回
std::stringstream&
,编译器在
命名空间std
中的一个之前找到一个。但是,在编辑之后,现在不会编译,因为相同的重载现在在
类foo
中从未考虑过,并且通过ADL找到了
中的期望值。也许您可以评论一下为什么他的重载
朋友stringstream&operator>>(std::stringstream&s,uint8\U t&v)
没有被调用。@GuyGreer可能是因为它不可见。如果