Вопросы про шаблоны
От: 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[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 Россия  
Дата: 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]: Вопросы про шаблоны
От: quodum  
Дата: 10.11.10 06:19
Оценка: +2
Здравствуйте, wander, Вы писали:

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

Не взлетит. Потому что шаблон std::vector имеет не менее двух параметров (помимо хранимого типа присутствует аллокатор). Разрешены и дополнительные параметры, нужные реализации STL, при условии, что для них заданы значения по умолчанию.
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[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[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)
Re[3]: Вопросы про шаблоны
От: Masterkent  
Дата: 12.11.10 17:09
Оценка: +1
quodum:

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


Где именно стандарт разрешает дополнительные параметры?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.