【问题标题】:Overloading operator<< for primitive types. Is that possible?为原始类型重载 operator<<。那可能吗?
【发布时间】:2010-10-06 09:04:52
【问题描述】:

嘿。是否可以为原始类型重载 operator

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 类型?

【问题讨论】:

    标签: c++ stl operator-overloading


    【解决方案1】:

    正如 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;
    }
    

    【讨论】:

    • 是的。这是完全没有意义的。但是我不知道我是否可以按照我的方式去做,或者我是否必须按照你的方式去做(这更没有意义)。但我只是在尝试不同的东西。
    • 而且您需要提供所有 int 运算符,而不仅仅是盒装 int 中的构造函数。
    • 确定我只是在演示。无论如何,这取决于他想用他的盒装 int 做什么:)
    【解决方案2】:

    请记住,这里您不仅在 int 上使用

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

    或者,您可以创建盒装 int 类并覆盖

    【讨论】:

      【解决方案3】:

      您的问题是 已经 运算符

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

      一切正常。

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

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

      【讨论】:

      • 很抱歉,我无法提供编译器打印出的错误输出。
      • 不,它没有。这与我在某个项目上遇到问题无关。我只是想知道如何重载,如果可以的话,重载原始类型。
      • 是的,你可以重载一个原始类型,但你只能这样做一次。编译器错误可能类似于“operator
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多