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可能是因为它不可见。如果