سؤال

لدي فصل يسمى الكسر ، وأعلن أن بعض المشغلين أصدقاء. أعلنت مشغلو الأصدقاء مسبقًا 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;
}
هل كانت مفيدة؟

المحلول

كما يقول "dark_charlie" ، لكن أزل const.

أفضل جعل هذا الأمر مجرد تعليق ، لكن لسوء الحظ ، لا يسمح لي Stackoverflow بعد بالتعليق (للشخص الذي يشعر بالرغبة في التعليق على أنه لا ينبغي أن أدلي بهذا التعليق: إنه يهدف إلى أنت).

نصائح أخرى

يحل محل

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&. هذا بالتأكيد سوف يسبب خطأ في الارتباط.

ملاحظة جانبية: يجب ألا تقوم الإجابة الأصلية بإصلاح الأخطاء وفقًا للأسئلة الشائعة. ومع ذلك ، سأعطيها لقطة إذا استمرت المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top