2010-10-07 74 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