Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реализация метода шаблонного класса

3.1K
21 октября 2003 года
man
38 / / 17.10.2003
Есть класс
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
3
21 октября 2003 года
Green
4.8K / / 20.01.2000
Ты запутал сам себя :D
а тем более компилятор.
Все несколько проще:
Код:
template<class TNumber>
class TPolyBase
{
public:
    TPolyBase& operator= (const TPolyBase &src)
    {
        ...........
        return *this;
    }

    TPolyBase operator+ (const TPolyBase &f)
    {
        ...........
    }
};


Если уж очеь надо внешний 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)
{
        ...........
}
461
21 октября 2003 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by man
здесь всё ок, а вот в этом случае :

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)
    {
        ...........
    }
};


чтобы он вызывался как метод класса.

3.1K
22 октября 2003 года
man
38 / / 17.10.2003
Спасибо за ответы! :) Посидел поэксперементировал, вроде кое-что получилось. Вот только вопрос... а разве перегружая обычный опреатор+ мы не можем контролировать, что к чему прибавляется? Например, a.GetSome() + GetSome(). Мне кажется, что можем, но мало ли какой ньюанс... ;)

До варианта

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)
{
.......
}

то компилятор просто её не воспринимает, хотя вроде бы синтаксически всё правильно
3
22 октября 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by man
но вот если определить дружественую операцию, и попытаться её реализовать вне описания класса, т.е:

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)
{
        ...........
}
3.1K
23 октября 2003 года
man
38 / / 17.10.2003
а-а-а! врубился! TPolyBase<TNumber>:: это действительно бред...мы просто сообщаем этой функции с какими классами ей работать, а gerard намекает, что с шаблонной функцией можно воспользоваться свойством полиморфизма. Теперь всё предельно ясно! Как говорят англичане clear() ;) Большое спасибо! :) Мне определённо надо подыскать более серьёзную литературу по С++. Жалко, что Василеску в инете только in english, а Страуструп очень тольстый, и не очень понятный...может его действительно нужно читать от корки до корки? :) Я всё переписал как вы и посоветовали, т.е. без друзей, но весь код методов отделён от описания класса. Всегда приятно пообщаться с Гуру С++ ;)
350
08 июня 2006 года
cheburator
589 / / 01.06.2006
Ну и жуть...
Никогда не пользовался шаблонами :)
3
08 июня 2006 года
Green
4.8K / / 20.01.2000
Я тожзе до 13 лет не понимал для чего используют презервативы.
Подрастешь, начнешь использовать. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог