Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > шаблоны, синтаксис


Автор: Artiom 17.4.2005, 09:43
Есть функция
Код

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

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

Автор: Alastis 17.4.2005, 10:22
А нельзя эти два класса наследовать от одного?

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


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


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

Автор: srd 17.4.2005, 10:37
Попробуй что-нибудь вроде этого.
Код

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;
}


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

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

Автор: Artiom 17.4.2005, 12:00
srd
Сделал как ты написал. В ответ пишет:
Цитата

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


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

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

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


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


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

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

Автор: Artiom 17.4.2005, 18:23
У меня vc++ 6.0. Чё-то не пашет

Автор: srd 18.4.2005, 02:53
Проверил в 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<> имеют уникальный интерфейс, то вызов функции с другим параметром будет приводить к ошибкам компиляции.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)