2016-06-14 83 views
1

對不起,如果這個問題已被回答allready,但我有一個閱讀了很多問題考慮重載這個運算符在模板類,但我還沒有找到像我這樣的特殊情況。重載運算符<<在模板類

這是我的代碼:

#include <iostream> 

using std::cout; 
using std::endl; 
using std::ostream; 

template <typename T> 
class Class 
{ 
    T x; 
    public: 
    friend ostream& operator << (const Class<T>&, ostream& out); 
}; 

template <typename T> 
ostream& operator << (const Class<T>&, ostream& out) 
{ 
    return (out << out.x << endl); 
} 

int main() 
{ 
    Class<short> object; 
    cout << object << endl; 
} 

而且我得到的最後一行此錯誤: 錯誤1錯誤C2679:二進制「< <」:沒有操作員發現這需要類型的右手操作數「類(或沒有可接受的轉換)G:\ ucenje \ objektno orijentirano programiranje \ template3 \ template3 \ main.cpp中25 1 template3

+0

的可能的複製[朋友聲明聲明一個非模板函數(http://stackoverflow.com/questions/4039817/friend-declaration-declares-a-non-template-function ) –

回答

4

1. std::ostream應的operator<<的第一參數,所以

template <typename T> 
ostream& operator << (const Class<T>&, ostream& out) 

應該是

template <typename T> 
ostream& operator << (ostream& out, const Class<T>& c) 

2.You定義operator<<作爲模板函數,但friend ostream& operator << (const Class<T>&, ostream& out);指向一個非模板功能,您應該將其更改爲

friend ostream& operator<< <T>(ostream& out, const Class<T>& c); 

和類的聲明之前添加一些前瞻性聲明:

template <typename T> 
class Class; 
template <typename T> 
ostream& operator << (ostream& out, const Class<T>& c); 

LIVE1

,也可以定義爲operator<<類的定義裏面非模板函數。

template <typename T> 
class Class 
{ 
    T x; 
    public: 
    friend ostream& operator<< (ostream& out, const Class<T>& c) 
    { 
     out << c.x << endl; 
     return out; 
    } 
}; 

LIVE2

+0

@Scarass編號'operator <<'必須是非成員函數。 – songyuanyao

+0

肯定嗎?但這只是模板類的權利? – Scarass

+0

@Scarass不,對於非模板類也是如此。注意'operator <<'必須將'ostream'作爲它的第一個參數,並且你可以認爲成員函數總是將該對象作爲第一個參數(作爲'this'指針)。 – songyuanyao

4

operator<<函數的參數已經被切換時,應當例如

friend ostream& operator << (ostream& out, const Class<T>&1); 

所有二元運算符的左邊總是第一個參數,右邊是第二個參數。