2013-11-03 38 views
0

我有模板類,它有一些朋友操作。編譯器抱怨「friend聲明瞭一個非模板函數」。不幸的是,我不知道如何解決這個錯誤。任何提示?如何在模板類中使用朋友操作符?

的代碼如下:

template<typename X> class Vect 
{ 

protected: 
    X v1_; 
    X v2_; 
    X v3_; 

public: 
    Vect(X v1, X v2, X v3); 
    Vect(const Vect<X> &v); 
    ~Vect(); 
    void printVect(); 
    friend ostream& operator<<(ostream& os, const Vect<X>& v); 
    friend const Vect<X> operator*(Vect<X>& v, X n); 
    friend const Vect<X> operator*(X n, Vect<X>& v); 


}; 


template<typename X> Vect<X>::Vect(X v1, X v2, X v3) 
    : v1_(v1),v2_(v2), v3_(v3) 
{ 
// v1_ = v1; 
// v2_ = v2; 
// v3_ = v3; 
} 

template<typename X> Vect<X>::Vect(const Vect<X> &v) 
    : v1_(v.v1_), v2_(v.v2_), v3_(v.v3_) 
{ 
} 

template<typename X> Vect<X>::~Vect() 
{ 
} 

template<typename X> void Vect<X>::printVect() 
{ 
    cout << "(" << v1_ << ", " << v2_ << ", " << v3_ << ")" << endl; 
} 

template<typename X> ostream& operator<<(ostream& os, const Vect<X>& v) 
{ 
    os << "(" << v.v1_ << ", " << v.v2_ << ", " << v.v3_ << ")" << endl; 
    return os; 
} 

template<typename X> const Vect<X> operator*(Vect<X>& v, X n) 
{ 
    Vect<X> tmp(v); 
    tmp.v1_ *= n; 
    tmp.v2_ *= n; 
    tmp.v3_ *= n; 
    return tmp; 
} 

template<typename X> const Vect<X> operator*(X n, Vect<X>& v) 
{ 
    return v*n; 
} 

Thans提前,

喬納斯

+0

您也可以查找在這裏。 http://stackoverflow.com/questions/10787655/c-friend-declaration-declares-a-non-template-function – Arunmu

回答

1

您需要爲原型的模板參數:

template <typename T> 
friend ostream& operator<<(ostream& os, const Vect<T>& v); 
+0

你的建議讓我更進一步!謝謝!現在,編譯器抱怨訪問運算符(<<,*)內的受保護成員變量v1_,v2_和v3_。朋友操作員不能訪問受保護的類成員嗎? – Jonas

+0

@Jonas我認爲你需要'operator *'的相同解決方案。是的,朋友功能可以訪問受保護的類成員。 – 0x499602D2

+0

將類中的聲明更改爲'template friend ostream&operator <<(ostream&os,const Vect & v);'。現在,類中的聲明不會聲明稍後定義的'operator >> – jrok