Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шаблоны, синтаксис 
:(
    Опции темы
Artiom
Дата 17.4.2005, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Есть функция
Код

template <class Data> void Func (M<Data>& );

У меня есть два класса M<Data> и T<Data>. Я хочу иметь возможность передавать в функцию экземпляры обоих классов. Как изменить заголовок функции?


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Alastis
Дата 17.4.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

Репутация: 4
Всего: 10



А нельзя эти два класса наследовать от одного?


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
chipset
Дата 17.4.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Первый вариант:
Цитата(Alastis @ 17.4.2005, 00:22)
два класса наследовать от одного


Второй вариант:
Перегрузить и для того, и для того варианта функции.


Я бы предпочел второй вариант smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
srd
Дата 17.4.2005, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Попробуй что-нибудь вроде этого.
Код

template<class Data> class M
{
};

template<class Data> class T
{
};

template<template<class> class C, class Data> void Func(C<Data>&)
{
};

int main(void)
{
    M<int> m;
    T<int> t;
    Func(m);
    Func(t);
    return 0;
}




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
chipset
Дата 17.4.2005, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Только надо не забыть проверить: имеет ли параметр С тип M или T.
Добавлено @ 10:53
Цитата(Alastis @ 17.4.2005, 00:22)
А нельзя эти два класса наследовать от одного?

А что если в класс протекут другие наследники базового?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Artiom
Дата 17.4.2005, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



srd
Сделал как ты написал. В ответ пишет:
Цитата

error C2954: template definitions cannot nest
error C2951: template declarations are only permitted at global or namespace scope


P.S. Наследовать эти классы один от другого для меня нет смысла. А перегружать функцию для двух классов жаба душит - внутри функции не нужно менять ни одной строчки.


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Alastis
Дата 17.4.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

Репутация: 4
Всего: 10



Цитата(chipset @ 17.4.2005, 10:51)
А что если в класс протекут другие наследники базового?

да, могут... видимо нужно все таки перегружатьsmile


Цитата(Artiom @ 17.4.2005, 12:00)
Наследовать эти классы один от другого для меня нет смысла. А перегружать функцию для двух классов жаба душит - внутри функции не нужно менять ни одной строчки.


Не хочется перегружать, а придетсяsmile... Перегрузку как раз для таких целей и сделали


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
srd
Дата 17.4.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Я это проверял с gcc 3.3.3 - всё компилировалось успешно.
К сожалению, сейчас проверить с vc++ у меня нет возможности.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Artiom
Дата 17.4.2005, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



У меня vc++ 6.0. Чё-то не пашет


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
srd
Дата 18.4.2005, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Проверил в VC++7.1 - тоже всё нормально скомпилировалось. Видимо VC++6.0 не понимает конструкции template<template<class> ... > и т.п.
Попробуй тогда просто:
Код

template<class Data> class M
{
};
template<class Data> class T
{
};
template<class C> void Func(C&)
{
};
int main(void)
{
    M<int> m;
    T<int> t;
    Func(m);
    Func(t);
    return 0;
}

Конечно, тогда передать функции Func можно всё, что угодно, но если M<> и T<> имеют уникальный интерфейс, то вызов функции с другим параметром будет приводить к ошибкам компиляции.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.