重载运算符<<对于原始类型。那可能吗?

时间:2009-02-09 11:09:53

标签: c++ stl operator-overloading

嘿。是否有可能重载运算符<<对于原始类型? 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类型?

3 个答案:

答案 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