模板类+运算符+朋友=未解析的外部

时间:2010-10-07 21:05:47

标签: c++ operator-overloading unresolved-external

我有一个名为fraction的类,我将某些运算符声明为朋友。我事先声明了朋友操作员,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;
}

2 个答案:

答案 0 :(得分:4)

正如“dark_charlie”所说,但删除了const

我宁愿把它作为一个评论,但遗憾的是StackOverflow还不允许我发表评论(感觉有人评论我不应该发表评论的人:它的目标是)。

答案 1 :(得分: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&。这肯定会导致链接器错误。

附注:原始答案不应根据常见问题解答修复错误。但是,如果问题仍然存在,我会试一试。