Visual C ++ не видит оператора << перегрузка - PullRequest
0 голосов
/ 19 мая 2010

У меня есть векторный класс, который я хочу иметь возможность ввода / вывода из объекта QTextStream. Предварительное объявление моего векторного класса:

namespace util {
  template <size_t dim, typename T>
  class Vector;
}

Я определяю operator<< как:

namespace util {
template <size_t dim, typename T>
QTextStream& operator<<(QTextStream& out, const util::Vector<dim,T>& vec)
{
   ...
}

template <size_t dim, typename T>
QTextStream& operator>>(QTextStream& in,util::Vector<dim,T>& vec)
{
   ..
}
}

Однако, если я попытаюсь использовать эти операторы, Visual C ++ возвращает эту ошибку:

error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'QTextStream' (or there is no acceptable conversion)

Несколько вещей, которые я пробовал:

  • Изначально методы были определены как друзья шаблона, и с g ++ он работает нормально.
  • Методы были перемещены за пределы пространства имен util
  • Я изменил определение шаблонов, чтобы оно соответствовало тому, что я нашел на различных сайтах Visual C ++.

Исходное объявление друга:

friend QTextStream& operator>>(QTextStream& ss, Vector& in) { ... }

Версия, адаптированная для Visual C ++:

friend QTextStream& operator>> <dim,T>(QTextStream& ss, Vector<dim,T>& in);

с функцией, предварительно объявленной до класса и реализованной после. Я проверил, правильно ли включен файл, используя:

#pragma message ("Including vector header")

И все вроде нормально. Кто-нибудь знает, что может быть не так?

Примечание: определение оператора даже не появляется в списке операторов << найдено. </p>

Ответы [ 3 ]

1 голос
/ 02 ноября 2013

Я столкнулся с той же проблемой, и я понял, что происходит.По какой-то причине MSVC иногда допускает ошибку std :: endl для endl, определенного в QTextStream (конечно, если вы где-то «используете пространство имен std», такое поведение подходит).

Кроме того, я думаю, что MSVC иногда получаетпутать со std :: strings (возможно, если они являются const или адресами или чем-то в этом роде) с QTextStream.

MSVC имеет тенденцию быть очень внимательным к const / & вариантам перегрузок, особенно в тех случаях, когданекоторая двусмысленность.Я видел это раньше с не-QT-кодом с некоторыми перегруженными функциями.

Конечно, сообщения об ошибках просто сбивают с толку, поэтому, возможно, мой анализ здесь неправильный.

0 голосов
/ 19 мая 2010

Трудно сказать, не видя фактического сайта создания экземпляров, но пока я заметил, что ошибка говорит о том, что нет подходящего оператора для QTextStream, и ваши реализации используют QTextStream &. Это может быть связано с тем, что вы пытаетесь использовать оператор для R-значения, их можно преобразовать в const &, но не только &.

0 голосов
/ 19 мая 2010

Вы забыли сделать перегрузку, которая приняла const Вектор фактически const.

...