Re[2]: Вопросы про шаблоны
От: quodum  
Дата: 10.11.10 06:19
Оценка: +2
Здравствуйте, wander, Вы писали:

template <typename T, template<typename> class CONT = std::vector>
class Stack
{
};

Не взлетит. Потому что шаблон std::vector имеет не менее двух параметров (помимо хранимого типа присутствует аллокатор). Разрешены и дополнительные параметры, нужные реализации STL, при условии, что для них заданы значения по умолчанию.
Re[2]: Вопросы про шаблоны
От: Erop Россия  
Дата: 09.11.10 16:44
Оценка: +1
Здравствуйте, wander, Вы писали:

А можно и так:
XJ>>
XJ>>template <typename T, class CONT = std::vector<T> >
XJ>>class Stack
XJ>>{
XJ>>private:
XJ>>    CONT elems;
XJ>>public:
XJ>>    void push(T const&);
XJ>>    void pop();
XJ>>    T top() const;
XJ>>};
XJ>>


W>)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Вопросы про шаблоны
От: igna Россия  
Дата: 10.11.10 12:57
Оценка: +1
Здравствуйте, quodum, Вы писали:

Q>Не взлетит. Потому что шаблон std::vector имеет не менее двух параметров (помимо хранимого типа присутствует аллокатор). Разрешены и дополнительные параметры, нужные реализации STL, при условии, что для них заданы значения по умолчанию.


Эти проблемы решаются:

template <typename T>
struct vector_with_the_only_template_parameter : std::vector<T> {};

template
< typename T
, template<typename> class CONT = vector_with_the_only_template_parameter
>
class Stack
{
private:
  CONT<T> elems;
public:
  void push(T const&);
  void pop();
  T top() const;
};
Re[3]: Вопросы про шаблоны
От: Masterkent  
Дата: 12.11.10 17:09
Оценка: +1
quodum:

Q>Не взлетит. Потому что шаблон std::vector имеет не менее двух параметров (помимо хранимого типа присутствует аллокатор). Разрешены и дополнительные параметры, нужные реализации STL, при условии, что для них заданы значения по умолчанию.


Где именно стандарт разрешает дополнительные параметры?
Вопросы про шаблоны
От: XJess  
Дата: 09.11.10 15:32
Оценка:
Привет всем!
Хочу разъяснить для себя некоторые вопросы. Когда пытаюсь сделать так:

template <typename T>
class Stack
{
private:
    std::vector<T> elems;
public:
    void push(T const&);
    void pop();
    T top() const;

    bool empty() const
    {
        return elems.empty();
    }
};

template <typename T, typename CONT = std::vector>
class Stack
{
private:
    CONT elems;
public:
    void push(T const&);
    void pop();
    T top() const;
};


в VS, то получаю ругань "error C2977: 'Stack' : too many template arguments", а если переименовываю второй класс в Stack2, то все ок.

1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?
2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?
Re: Вопросы про шаблоны
От: Lorenzo_LAMAS  
Дата: 09.11.10 16:17
Оценка:
XJ>1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?

да

XJ>2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?


особенности компилятора
Of course, the code must be complete enough to compile and link.
Re: Вопросы про шаблоны
От: wander  
Дата: 09.11.10 16:32
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>
XJ>template <typename T, template<typename> class CONT = std::vector>
XJ>class Stack
XJ>{
XJ>private:
XJ>    CONT<T> elems;
XJ>public:
XJ>    void push(T const&);
XJ>    void pop();
XJ>    T top() const;
XJ>};
XJ>


Re[3]: Вопросы про шаблоны
От: igna Россия  
Дата: 09.11.10 18:20
Оценка:
Здравствуйте, Erop, Вы писали:

E>А можно и так:

template <typename T, class CONT = std::vector<T> >


А зачем? Чтобы, если нужен контейнер не по умолчанию, указывать аргумент для T два раза? Как можно извлечь пользу из того, что тип элементов контейнера не совпадает с типом аргумента функции push и с типом результата функции top?
Re[4]: Вопросы про шаблоны
От: Erop Россия  
Дата: 09.11.10 18:32
Оценка:
Здравствуйте, igna, Вы писали:

I>А зачем? Чтобы, если нужен контейнер не по умолчанию, указывать аргумент для T два раза? Как можно извлечь пользу из того, что тип элементов контейнера не совпадает с типом аргумента функции push и с типом результата функции top?


Ну, от дизайна класса зависит как. Например, кто-то из них может быть ссылкой
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Вопросы про шаблоны
От: igna Россия  
Дата: 09.11.10 18:36
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну, от дизайна класса зависит как. Например, кто-то из них может быть ссылкой


В приведенном примере вроде никто.
Re[6]: Njkmrj cvfqkbrb $)
От: Erop Россия  
Дата: 09.11.10 18:39
Оценка:
Здравствуйте, igna, Вы писали:

E>>Ну, от дизайна класса зависит как. Например, кто-то из них может быть ссылкой

I>В приведенном примере вроде никто.

Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Вопросы про шаблоны
От: night beast СССР  
Дата: 10.11.10 04:54
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Хочу разъяснить для себя некоторые вопросы. Когда пытаюсь сделать так:

интересно, с какого языка ты решила на Си перелезть?

XJ>в VS, то получаю ругань "error C2977: 'Stack' : too many template arguments", а если переименовываю второй класс в Stack2, то все ок.


XJ>1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?


да.

XJ>2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?


нормально.
Re[2]: Вопросы про шаблоны
От: pvirk Россия  
Дата: 10.11.10 10:13
Оценка:
Здравствуйте, night beast, Вы писали:

NB>интересно, с какого языка ты решила на Си перелезть?

По постам очевидно, что с шарпа.
Re[3]: Вопросы про шаблоны
От: XJess  
Дата: 10.11.10 10:18
Оценка:
Здравствуйте, pvirk, Вы писали:

P>Здравствуйте, night beast, Вы писали:


NB>>интересно, с какого языка ты решила на Си перелезть?

P>По постам очевидно, что с шарпа.

Вы не поверите... но такая дура, как я, умудряется учить эти два языка одновременно...
Re[4]: Вопросы про шаблоны
От: night beast СССР  
Дата: 10.11.10 10:24
Оценка:
Здравствуйте, XJess, Вы писали:

NB>>>интересно, с какого языка ты решила на Си перелезть?

P>>По постам очевидно, что с шарпа.

XJ>Вы не поверите... но такая дура, как я, умудряется учить эти два языка одновременно...


не верим у людей, которые начинают учить си без бэкграунда, таких вопросов обычно не возникает
а зачем сразу оба? не боишься что как в пословице получится?
Re[5]: Вопросы про шаблоны
От: XJess  
Дата: 10.11.10 14:48
Оценка:
Здравствуйте, night beast, Вы писали:

XJ>>Вы не поверите... но такая дура, как я, умудряется учить эти два языка одновременно...


NB>не верим у людей, которые начинают учить си без бэкграунда, таких вопросов обычно не возникает

NB>а зачем сразу оба? не боишься что как в пословице получится?

У меня выбора нет — на нынешней работе надо писать на обоих. К тому же, меня окружают маньяки, которые постоянно капают на мозги, чтобы я их оба учила.
Re[6]: Вопросы про шаблоны
От: Chorkov Россия  
Дата: 10.11.10 14:53
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>У меня выбора нет — на нынешней работе надо писать на обоих. К тому же, меня окружают маньяки, которые постоянно капают на мозги, чтобы я их оба учила.


Вероятно, имеют ввиду, что выучить их надо оба. Но учить можно и последовательно.
Re: Вопросы про шаблоны
От: sizeof_void Россия  
Дата: 12.11.10 14:01
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Хочу разъяснить для себя некоторые вопросы. Когда пытаюсь сделать так:

XJ>
XJ>template <typename T>
XJ>class Stack
XJ>{
XJ>private:
XJ>    std::vector<T> elems;
XJ>public:
XJ>    void push(T const&);
XJ>    void pop();
XJ>    T top() const;

XJ>    bool empty() const
XJ>    {
XJ>        return elems.empty();
XJ>    }
XJ>};

XJ>template <typename T, typename CONT = std::vector>
XJ>class Stack
XJ>{
XJ>private:
XJ>    CONT elems;
XJ>public:
XJ>    void push(T const&);
XJ>    void pop();
XJ>    T top() const;
XJ>};
XJ>


XJ>в VS, то получаю ругань "error C2977: 'Stack' : too many template arguments", а если переименовываю второй класс в Stack2, то все ок.


XJ>1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?

XJ>2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?


1) Нельзя двум типам (классам) давать одно имя в общем пространстве имён.

2) Объявления классов, которые не используются в программе, компилятор игнорит.


Успехов! =)
"May the Force be with us all!" (c)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.