3

嘿。是否可以为原始类型重载 operator<< ?Fx 可以说我想写一个 std::endl 每次想写一个 int。我可以为 int 重载 operator<<,以便它自动将 std::endl 放到输出中吗?我试过这个,

std::ostream& operator<<(std::ostream& strm, int & i)
{
   strm << i << std::endl;
   return strm;
}

但它不起作用。我不记得编译器错误消息,但我认为我让运算符重载所有错误的方式。我尝试以这种方式调用上面的重载运算符<<,

int main()
{
   int i = 2;
   std::out<<"Here is an int " << i;

   return 0;
}

但它根本不起作用。也许我不能重载 POD 类型?

4

3 回答 3

2

请记住,这里您不仅在 int 上而且在 ostream 上使用 << 运算符。您可以从 ostream 派生并在自己的派生类中实现它,但我建议制作一个简单的宏,例如

#define EL(i) (i)<<std::endl

或者,您可以创建盒装 int 类并覆盖标准 ostream 和盒装 int 的 <<(如 Iraimbilanja 的回答)类。听起来有点矫枉过正,但可以工作。

于 2009-02-09T11:20:15.837 回答
2

正如 zabzonk 所说,标准库提供了 (ostream&, 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;
}
于 2009-02-09T11:28:24.380 回答
1

您的问题是operator << (ostream &, int)已经存在重载,该重载由 C++ 标准库提供。如果您删除重载定义并使用:

#include <iostream>
int main()
{
   int i = 2;
   std::out<<"Here is an int " << i;

   return 0;
}

事情按预期工作。

顺便说一句,编译器错误消息很重要,因此最好记住它们并在提问时在帖子中引用它们。

编辑 - 上面的 std::out 应该是 std::cout

于 2009-02-09T11:21:24.773 回答