2010-05-19 83 views
0

我有一個向量類,我希望能夠從QTextStream對象中輸入/輸出。我的矢量類的向前聲明:Visual C++沒有看到operator << overload

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) 
{ 
    .. 
} 
} 

但是,如果我將ty使用這些運營商時,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") 

而且一切似乎都很好。沒有人知道什麼可能是錯的?

說明:運營商的定義甚至不會出現在運營商列表< <找到。

+1

請提供您嘗試使用操作員時的使用案例 – 2010-05-19 18:08:24

+0

當您在使用時,請提供完整的,可編譯的(或不是)代碼示例。 – Thomas 2010-05-19 18:11:28

+0

不幸的是,試圖減小程序的大小可以解決問題。它似乎是一個奇怪的東西:( – PierreBdR 2010-05-19 19:24:33

回答

-1

你忘了做一個const Vector的重載實際上是const。

+0

)自由函數(即非成員函數),如這些運算符,不能是'const'。 – Thomas 2010-05-19 18:10:17

0

很難說沒有看到實際的實例化站點,但到目前爲止我注意到的是,錯誤表示沒有合適的QTextStream運算符,並且您的實現使用QTextStream &。這可能是因爲您試圖在R值上使用運算符,可以將它們轉換爲const &,但不僅是&。

1

我遇到了同樣的問題,我想我知道發生了什麼。出於某種原因,MSVC有時會在QTextStream中定義的endl中錯誤地使用std :: endl(當然如果你在任何地方「使用namespace std」,這種行爲是合適的)。另外,我認爲MSVC有時會與QTextStream混淆std :: strings(也許如果它們是const或地址或類似的東西)。

MSVC傾向於對過載的變體非常特別,尤其是在可能存在某些不明確的情況下。我以前看過這個非QT代碼,有一些重載函數。

當然,這些錯誤信息只是令人困惑,所以我的分析可能是錯誤的。