шаблон класса + операторы + друзья = неразрешенные внешние - PullRequest
0 голосов
/ 08 октября 2010

У меня есть класс дроби, и я объявляю некоторых операторов друзьями. Я заранее объявил операторы друзей, как мне сказал 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 ]

4 голосов
/ 08 октября 2010

Как говорит "dark_charlie", но удалите const.

Я бы предпочел сделать это просто комментарием, но, к сожалению, StackOverflow пока не позволяет мне комментировать (человеку, чувствующемупризываю комментировать, что я не должен делать этот комментарий: он нацелен на you ).

2 голосов
/ 08 октября 2010

Заменить

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

с

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

И аналогично для другого оператора. Проблема в том, что таким образом вы создаете пустую специализацию шаблона, которая дает символ, отличный от того, который был объявлен как друг.

EDIT:

Другая проблема, которую я вижу, - это предварительное объявление:

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

Вы объявляете его первый параметр как const ostream&, он должен быть const istream&. Это определенно приведет к ошибке компоновщика.

Примечание: оригинальный ответ не должен исправлять ошибки в соответствии с часто задаваемыми вопросами. Тем не менее, я бы попробовал, если бы проблема сохранялась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...