Visual C ++没有看到运算符<<超载

时间:2010-05-19 18:05:17

标签: visual-c++ qt4 operator-overloading compiler-errors

我有一个矢量类,我希望能够从QTextStream对象输入/输出。我的vector类的前向声明是:

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")

一切似乎都很好。没有人知道可能出现什么问题吗?

注意:运营商的定义甚至没有出现在运营商列表中&lt;&lt;找到。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我想我弄清楚发生了什么。出于某种原因,MSVC有时会错误地将std :: endl用于QTextStream中定义的endl(当然如果你在任何地方“使用namespace std”,这种行为是合适的。)

另外,我认为MSVC有时会与std :: strings(可能是const或地址或类似的东西)混淆QTextStream。

MSVC对const /&amp; amp;重载的变体,特别是在可能存在歧义的情况下。我之前已经看过非QT代码和一些重载函数。

当然,错误信息只是令人困惑所以,可能是我的分析在这里错了。

答案 1 :(得分:0)

很难说没有看到实际的实例化站点,但到目前为止我注意到的是错误说QTextStream没有合适的运算符,并且您的实现使用QTextStream&amp ;.这可能是因为您试图在R值上使用运算符,这些运算符可以转换为const&amp;,但不仅仅是&amp;。

答案 2 :(得分:-1)

你忘了让const Vector实际上是const的重载。