0

我不小心尝试使用 std::ostream 流式传输 QString。但是,编译(Windows SDK 7.1)成功,但发出警告:

Warning:C4717: 'operator<<' : recursive on all control paths, function will cause runtime stack overflow

最后,我想知道为什么会出现递归。这是一小段要重现的代码。注意:如果没有重载的构造函数,编译器会引发预期的错误(未找到采用“QString”类型的右手操作数的运算符)。

#include <iostream>
#include <QString>

class CTest
{
  public:
    CTest(QString str) {}
    friend std::ostream & operator <<(std::ostream & out, const CTest & cTest)
    {
      out << "std::string";
      out << QString("HelloWorld");

      return out;
    }
};

int main(int argc, char *argv[])
{ 
  CTest t("testing");
  std::cout << t;

  return 0;
}
4

1 回答 1

0

由于 QString 没有定义运算符 <<,因此行

out << QString("HelloWorld");

被隐式转换为

out << CTest(QString("HelloWorld"));

(最接近的重载,由于构造函数 CTest(QString str)),它无限次地递归调用 operator <<。

于 2013-04-29T14:11:53.710 回答