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

2 に答える 2

4

「dark_charlie」が言うように、const.

これは単なるコメントとして書きたかったのですが、残念ながら StackOverflow ではまだコメントすることができません (このコメントをするべきではないというコメントをしたいという衝動を感じている人へ: それはあなたを対象としています)。

于 2010-10-07T21:17:58.023 に答える
2

交換

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

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

そして、他の演算子についても同様です。問題は、この方法で空のテンプレートの特殊化を作成し、友人として前方宣言されたものとは異なるシンボルを生成することです。

編集:

私が目にするもう1つの問題は、この前方宣言です。

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

最初のパラメーターを として宣言しconst ostream&ますconst istream&。これは間違いなくリンカ エラーを引き起こします。

サイドノート:FAQによると、元の回答でエラーを修正するべきではありません。ただし、問題が解決しない場合は試してみます。

于 2010-10-07T21:09:17.883 に答える