嘿。是否有可能重载运算符<<对于原始类型? Fx让我说我想写一个std :: endl每次想写一个int。我可以重载运算符<< for int,以便自动将std :: endl放到输出中?我试过这个,
std::ostream& operator<<(std::ostream& strm, int & i)
{
strm << i << std::endl;
return strm;
}
但它不起作用。我无法回想起编译器错误消息,但我认为我的运算符重载都是错误的。 我尝试调用上面重载的运算符&lt;&lt;这样,
int main()
{
int i = 2;
std::out<<"Here is an int " << i;
return 0;
}
但它根本不起作用。也许我不能超载POD类型?
答案 0 :(得分:2)
请记住,你在这里使用&lt;&lt;运算符不仅在int上,而且在ostream上。您可以从ostream派生并在您自己的派生类中实现它,但我建议创建一个简单的宏,如
#define EL(i) (i)<<std::endl
或者你可以制作盒装的int类并覆盖&lt;&lt;对于标准ostream和boxed int(如Iraimbilanja的回答)类。听起来有点矫枉过正,但可以奏效。
答案 1 :(得分:2)
正如zabzonk所说,标准库提供了一个(ostream&amp;,int)重载,所以你不能定义另一个。
模拟你正在做的事情(虽然现在形式完全没有意义:):
class EndlinedInteger {
public:
EndlinedInteger(int i) : i(i) { }
friend ostream& operator<<(ostream&, EndlinedInteger const&);
private:
int i;
};
ostream& operator<<(ostream& out, EndlinedInteger const& ei) {
out << ei.i << endl;
return out;
}
int main()
{
EndlinedInteger i = 2;
std::cout<<"Here is an int " << i;
}
答案 2 :(得分:1)
你的问题是已经运算符的重载&lt;&lt; (ostream&amp;,int),由C ++标准库提供的。如果删除了重载定义并使用:
#include <iostream>
int main()
{
int i = 2;
std::out<<"Here is an int " << i;
return 0;
}
事情按预期发挥作用。
顺便说一下,编译器错误消息很重要,所以记住它们并在提问时在帖子中引用它们是个好主意。
编辑 - 上面的std :: out应该是std :: cout