Загадочное поведение при попытке использовать потоковый оператор std::ostream с QString

Я случайно попытался передать QString с помощью std::ostream. Однако компиляция (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;
}

person braggPeaks    schedule 23.01.2013    source источник


Ответы (1)


Поскольку в QString не определен оператор ‹‹, строка

out << QString("HelloWorld");

неявно преобразуется в

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

(ближайшая перегрузка из-за конструктора CTest(QString str)), который рекурсивно вызывает оператор ‹‹ для CTest бесконечное количество раз.

person Ilya Kobelevskiy    schedule 29.04.2013