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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование шаблонных классов 
V
    Опции темы
SABROG
Дата 30.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Вот что у меня есть:

Код

template <typename T>
class cA
{
public:
    cA(T){};
};

template <class T1, class T2>
class cB
{
public:
    cB(const T1 &t1, const T2 &t2){};
};


Так это работает:

Код

    cB<int, int> tst(1, 2);
    cA<cB<int, int> > tst2(tst);


Хочу создать третий класс, который объединит эти 2 в один, таким образом, чтобы можно было использовать так:

Код

cC tst3(1, 2);


Но второй параметр не должен быть жестко int'овым, т.е. чтобы и так тоже можно было:

Код

    cD tst4;
    cC(1, tst4);


При этом - нельзя менять коды классов cA, cB. Нельзя копировать код из cA, cB. Т.е. известен только интерфейс. Можно только наследовать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Daevaorn
Дата 30.4.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Что вы уже предприняли и с какими проблемами столкнулись?
PM MAIL WWW   Вверх
SABROG
Дата 30.4.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Я предпринял следующее:

Код

template <class T>
class cC : cA<cB<int, T> >
{
public:
    cC(int, T){};
};


И попытался заюзать:

Код

cB<int, int> tst(1, 2);
cC<cB<int, int> > tst5(1, tst);


Получил пару ошибочек:

Цитата

include/Dict.h: In constructor `cC<T>::cC(int, T) [with T = cB<int, int>]':
src\Dict.cpp:67:   instantiated from here
include/Dict.h:23: error: no matching function for call to `cA<cB<int, cB<int, int> > >::cA()'
include/Dict.h:7: note: candidates are: cA<cB<int, cB<int, int> > >::cA(const cA<cB<int, cB<int, int> > >&)
include/Dict.h:9: note:                 cA<T>::cA(T) [with T = cB<int, cB<int, int> >]


Да и само объявление объекта класса выглядит ни как я хочу "cC tst5(1, tst);"


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
JackYF
Дата 30.4.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(SABROG @  30.4.2008,  15:17 Найти цитируемый пост)
cC(int, T){};

Хм... ну конечно, конструктор базового класс нужно инициализировать:

Код

cC(int i, T t) : cA(cb(i, T)) {}


Это сообщение отредактировал(а) JackYF - 30.4.2008, 17:48


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
SABROG
Дата 30.4.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Чет никак

Код

include/Dict.h: In constructor `cC<T>::cC(int, T)':
include/Dict.h:23: error: class `cC<T>' does not have any field named `cA'
include/Dict.h:23: error: missing template arguments before '(' token
include/Dict.h:23: error: expected primary-expression before ')' token
include/Dict.h: In constructor `cC<T>::cC(int, T) [with T = cB<int, int>]':
src\Dict.cpp:67:   instantiated from here
include/Dict.h:23: error: no matching function for call to `cA<cB<int, cB<int, int> > >::cA()'
include/Dict.h:7: note: candidates are: cA<cB<int, cB<int, int> > >::cA(const cA<cB<int, cB<int, int> > >&)
include/Dict.h:9: note:                 cA<T>::cA(T) [with T = cB<int, cB<int, int> >]



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
JackYF
Дата 30.4.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Код

cC(int i, T t) : cA<cB<int, T> >(cb(i, T)) {}

?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
SABROG
Дата 30.4.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(JackYF @ 30.4.2008,  18:10)
Код

cC(int i, T t) : cA<cB<int, T> >(cb(i, T)) {}

?


Цитата

cC(int i, T t) : cA<cB<int, T> >(cB(i, T)) {}


Код

include/Dict.h: In constructor `cC<T>::cC(int, T)':
include/Dict.h:23: error: missing template arguments before '(' token
include/Dict.h:23: error: expected primary-expression before ')' token


Кстати может ну их эти шаблоны ? Если компилер под каждый тип создает свой код. Лучше тогда void * передать и конвертить по мере необходимости...

Это сообщение отредактировал(а) SABROG - 30.4.2008, 18:45


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 30.4.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



не знаю правильно ли я тебя понял, но вот

Код

template <typename T>
class cA
{
public:
    cA(T){};
};
template <class T1, class T2>
class cB
{
public:
    cB(const T1 &t1, const T2 &t2){};
};

template<typename T1, typename T2>
class cC : public cA<cB<T1, T2> >
{
public:
    cC(T1 p1, T2 p2) : cA( cB<T1,T2>(p1, p2) )
    {
    }
};

int main(int argc, char* argv[])
{
    cC<int, double> cc(111, 111.111);
}

PM MAIL Skype GTalk   Вверх
archimed7592
Дата 30.4.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(SABROG @  30.4.2008,  18:13 Найти цитируемый пост)
cC(int i, T t) : cA<cB<int, T> >(cB(i, T)) {}

Либо
Код

cC(int i, T t) : cA<cB<int, T> >(cB<int, T>(i, T)) {}

Либо
Код

template <class T>
class cC : cA<cB<int, T> >
{
    typedef cB< int, T > cB;
    typedef cA< cB > cA; // эт вроде не обязательно, ибо оно и так implicitly injected
public:
    cC(int i, T t) : cA(cB(i, T)) {}
};

З.Ы. На компиляторе не проверял, но, 
Цитата(SABROG @  30.4.2008,  18:13 Найти цитируемый пост)
error: missing template arguments before '(' token

говорит именно о том, что ты пропустил список шаблонных аргументов перед открывающейся скобкой...


Цитата(SABROG @  30.4.2008,  18:13 Найти цитируемый пост)
Лучше тогда void * передать и конвертить по мере необходимости...

Не могу сказать, что это лучше. С тем же успехом как ты отказываешься от строгой типизации можно отказаться и от ООП, к примеру...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 30.4.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Цитата(archimed7592 @ 30.4.2008,  20:13)
Код

template <class T>
class cC : cA<cB<int, T> >
{
    typedef cB< int, T > cB;
    typedef cA< cB > cA; // эт вроде не обязательно, ибо оно и так implicitly injected
public:
    cC(int i, T t) : cA(cB(i, T)) {}
};

Этот вариант собрался, спс. Насчет коммента про то что "эт вроде не обязательно, ибо оно и так implicitly injected". Может оно и так, но без этой строчки ничего не собирается:

Цитата

include/Dict.h: In constructor `cC<T>::cC(int, T)':
include/Dict.h:25: error: class `cC<T>' does not have any field named `cA'
include/Dict.h: In constructor `cC<T>::cC(int, T) [with T = cB<int, int>]':
src\Dict.cpp:67:   instantiated from here
include/Dict.h:25: error: no matching function for call to `cA<cB<int, cB<int, int> > >::cA()'
include/Dict.h:7: note: candidates are: cA<cB<int, cB<int, int> > >::cA(const cA<cB<int, cB<int, int> > >&)
include/Dict.h:9: note:                 cA<T>::cA(T) [with T = cB<int, cB<int, int> >]


В итоге создание экземпляра класса сейчас выглядит вот так:

Код

cC <float> tst5(1, .5);


А нельзя заставить компилятор самому определять какой тип передается ? Т.е. чтобы было так:

Код

cC tst5(1, &object);
cC tst6(2, NULL);
cC tst7(3, 0xBADC0DE);
cC tst8(4, bool(true));



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 30.4.2008, 22:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



компилятор может вывести шаблонные параметры для функции, но не для класса

Добавлено через 3 минуты и 27 секунд
поэтому можно написать шаблонную функцию - конструктор, которая возвращала-бы экземпляр объекта нужного типа
Код

template<class T>
cC<T> make_cC(int a, T b)
{
  return cC<T>(a, b);
}

Type t;
make_cC(3, t);//--> вернет cC<Type>

PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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