2010-10-07 73 views
0

我有一個叫做分數的類,我宣佈一些運營商爲朋友。我事先聲明瞭朋友操作員,因爲http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16告訴我要這樣做,但它只修正了+, - ,*和/。 < <和>>依然不起作用。模板類+運營商+朋友=無法解析的外部

template <class T> class Fraction; 
template <class T> Fraction<T> operator+ (Fraction<T> const& left, Fraction<T> const& right); 
template <class T> Fraction<T> operator- (Fraction<T> const& left, Fraction<T> const& right); 
template <class T> Fraction<T> operator* (Fraction<T> const& left, Fraction<T> const& right); 
template <class T> Fraction<T> operator/ (Fraction<T> const& left, Fraction<T> const& right); 
template <class T> ostream& operator<< (const ostream& output, Fraction<T> const& value); 
template <class T> istream& operator>> (const ostream& input, Fraction<T> const& value); 

和類:

template <class T> 
class Fraction 
{ 
... 

friend Fraction<T> operator+ <>(const Fraction<T>& left, const Fraction<T>& right); 
friend Fraction<T> operator- <>(const Fraction<T>& left, const Fraction<T>& right); 
friend Fraction<T> operator* <>(const Fraction<T>& left, const Fraction<T>& right); 
friend Fraction<T> operator/ <>(const Fraction<T>& left, const Fraction<T>& right); 

friend ostream& operator<< <>(const ostream& output, const Fraction<T> value); 
friend istream& operator>> <>(const istream& input, Fraction<T> value); 
} 

template <class T> ostream& operator<< <>(const ostream& output, const Fraction<T>& value) 
{ 
output << value.Numerator << '/' << value.Denominator; 

return output; 
} 
template <class T> istream& operator>> <>(const istream& input, Fraction<T>& value) 
{ 
T n, d, char seperator; 

cin >> n >> seperator >> d; 

value.SetNumerator(n); 
value.SetDenominator(d); 

return input; 
} 

回答

4

正如「dark_charlie」所述,但刪除const

我寧願把它作爲一個評論,但不幸的是StackOverflow尚未允許我發表評論(對於那些覺得我不應該發表評論的人的評論:它的目標是 )。

+0

+1抱怨這麼多。希望別人upvote你,所以你可以停止抱怨;) – slashmais 2010-10-07 21:27:26

+0

啊,嗯,我回答了一個「賞金」的問題只是爲了。希望(但問題太模糊了,我不知道我的答案是否覆蓋了它),它會讓我超過所需的50分。我發現StackOverflow的這個特別的方面是完全令人困惑的,但也許它增加了一些類似遊戲的維度 - 賺錢點?或者它可能是一款反垃圾郵件設備?不管怎樣,謝謝! :-) – 2010-10-07 22:04:31

2

更換

template <class T> istream& operator>> <>(const istream& input, Fraction<T>& value) { ... 

template <class T> istream& operator>> (const istream& input, Fraction<T>& value) { ... 

而且類推爲其他運營商。問題是這樣你就創建了一個空白模板專門化,它產生了一個不同於前向聲明爲朋友的符號。

編輯:

我看到的另一個問題是此向前聲明:

template <class T> istream& operator>> (const ostream& input, Fraction<T> const& value); 

可以聲明其第一個參數爲const ostream&,它應該是const istream&。這肯定會導致鏈接器錯誤。

備註:原始答案不應該根據常見問題修正錯誤。不過,如果問題仍然存在,我會試一試。

+0

它不工作。這是一個鏈接到完整的代碼:http://pastebin.com/spam.php?i=yRBrYMtv希望你能幫助! – 2010-10-08 00:18:22

+0

對不起,該鏈接無效。這是正確的:http://pastebin.com/Taf2E9hR – 2010-10-08 00:40:19