template<class TNumber>
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
TPolyBase operator+ (const TPolyBase &f)
{
...........
}
};
Реализация метода шаблонного класса
template <class TNumber> class TPolyBase {
public:
TPolyBase<TNumber>& operator= (const TPolyBase<TNumber> &src);
friend TPolyBase<TNumber> operator+ (const TPolyBase<TNumber> &f, const TPolyBase<TNumber> &s);
...
}
Пока что два оператора = и +, и их реализация
template<class TNumber>
TPolyBase<TNumber>& TPolyBase<TNumber> :: operator= (const TPolyBase<TNumber> &src) {
....
}
здесь всё ок, а вот в этом случае :
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber>& f, const TPolyBase<TNumber>& s) {
...
}
компилятор пытается убедить меня, что метод не является частью класса TPolyBase X)-
По логике сначала шаблон template<class TNumber>, потом возвращяемый тип TPolyBase<TNumber>, потом класс, которому принадлежит TPolyBase<TNumber>, ну и остальная петрушка...Visual 6 на этом ваще загнулся, а вот борладовский фриварный компилятор кидает эдакое мерзопакостное сообщение, мол не наш ты братан - без класса совсем.
:x
а тем более компилятор.
Все несколько проще:
Код:
Если уж очеь надо внешний operator+, то тогда так:
Код:
template<class TNumber>
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
friend TPolyBase operator+ (const TPolyBase &f , const TPolyBase &s);
};
template<class TNumber>
TPolyBase<TNumber> operator+ (const TPolyBase<TNumber> &f , const TPolyBase<TNumber> &s)
{
...........
}
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
friend TPolyBase operator+ (const TPolyBase &f , const TPolyBase &s);
};
template<class TNumber>
TPolyBase<TNumber> operator+ (const TPolyBase<TNumber> &f , const TPolyBase<TNumber> &s)
{
...........
}
Цитата:
Originally posted by man
здесь всё ок, а вот в этом случае :
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber>& f, const TPolyBase<TNumber>& s) {
...
}
компилятор пытается убедить меня, что метод не является частью класса TPolyBase X)-
здесь всё ок, а вот в этом случае :
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber>& f, const TPolyBase<TNumber>& s) {
...
}
компилятор пытается убедить меня, что метод не является частью класса TPolyBase X)-
Перегружать подобным образом бинарный оператор имеет смысл только в том случае, если первый операнд (в вашем случае TPolyBase<TNumber>& f) не принадлежит к тому же классу, что и оператор, и вам непременно нужна возможность выполнять операцию именно в таком порядке (для сложения и умножения операнды можно просто поменять местами). В остальных случаях, когда первый операнд - того же класса, лучше перегружать оператор так, как посоветовал Green:
Цитата:
Код:
template<class TNumber>
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
TPolyBase operator+ (const TPolyBase &f)
{
...........
}
};
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
TPolyBase operator+ (const TPolyBase &f)
{
...........
}
};
чтобы он вызывался как метод класса.
До варианта
code:
template<class TNumber>
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
TPolyBase operator+ (const TPolyBase &f)
{
...........
}
};
я догадался, но всё-равно спасибо. :) Проблемы начинаются, когда пытаешься отделить описание класса от реализации его методов :(
code:
template<class TNumber>
class TPolyBase
{
public:
TPolyBase operator+ (const TPolyBase &f);
....
}
описание выглядит так:
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber> &f)
{
.......
}
но вот если определить дружественую операцию, и попытаться её реализовать вне описания класса, т.е:
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber> &f, const TPolyBase<TNumber> &f)
{
.......
}
то компилятор просто её не воспринимает, хотя вроде бы синтаксически всё правильно
Цитата:
Originally posted by man
но вот если определить дружественую операцию, и попытаться её реализовать вне описания класса, т.е:
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber> &f, const TPolyBase<TNumber> &f)
{
.......
}
то компилятор просто её не воспринимает, хотя вроде бы синтаксически всё правильно
но вот если определить дружественую операцию, и попытаться её реализовать вне описания класса, т.е:
template<class TNumber>
TPolyBase<TNumber> TPolyBase<TNumber> :: operator+ (const TPolyBase<TNumber> &f, const TPolyBase<TNumber> &f)
{
.......
}
то компилятор просто её не воспринимает, хотя вроде бы синтаксически всё правильно
Нет, семантически неверно. Если ты подразумеваешь, что это не член класса, а дружественная операция, то зачем TPolyBase<TNumber>:: ?
Я уже показывал, как будет верно:
Код:
template<class TNumber>
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
friend TPolyBase operator+ (const TPolyBase &f , const TPolyBase &s);
};
template<class TNumber>
TPolyBase<TNumber> operator+ (const TPolyBase<TNumber> &f , const TPolyBase<TNumber> &s)
{
...........
}
class TPolyBase
{
public:
TPolyBase& operator= (const TPolyBase &src)
{
...........
return *this;
}
friend TPolyBase operator+ (const TPolyBase &f , const TPolyBase &s);
};
template<class TNumber>
TPolyBase<TNumber> operator+ (const TPolyBase<TNumber> &f , const TPolyBase<TNumber> &s)
{
...........
}
а-а-а! врубился! TPolyBase<TNumber>:: это действительно бред...мы просто сообщаем этой функции с какими классами ей работать, а gerard намекает, что с шаблонной функцией можно воспользоваться свойством полиморфизма. Теперь всё предельно ясно! Как говорят англичане clear() ;) Большое спасибо! :) Мне определённо надо подыскать более серьёзную литературу по С++. Жалко, что Василеску в инете только in english, а Страуструп очень тольстый, и не очень понятный...может его действительно нужно читать от корки до корки? :) Я всё переписал как вы и посоветовали, т.е. без друзей, но весь код методов отделён от описания класса. Всегда приятно пообщаться с Гуру С++ ;)
Никогда не пользовался шаблонами :)
Подрастешь, начнешь использовать. :)