我有一个矢量类,我希望能够从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)
我试过的一些事情:
原始朋友声明是:
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;找到。
答案 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的重载。