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) による最も近いオーバーロード) は、演算子 << を CTest 無限回再帰的に呼び出します。

于 2013-04-29T14:11:53.710 に答える