в VS, то получаю ругань "error C2977: 'Stack' : too many template arguments", а если переименовываю второй класс в Stack2, то все ок.
1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?
2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?
XJ>1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?
да
XJ>2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?
особенности компилятора
Of course, the code must be complete enough to compile and link.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
template <typename T, class CONT = std::vector<T> >
А зачем? Чтобы, если нужен контейнер не по умолчанию, указывать аргумент для T два раза? Как можно извлечь пользу из того, что тип элементов контейнера не совпадает с типом аргумента функции push и с типом результата функции top?
Здравствуйте, igna, Вы писали:
I>А зачем? Чтобы, если нужен контейнер не по умолчанию, указывать аргумент для T два раза? Как можно извлечь пользу из того, что тип элементов контейнера не совпадает с типом аргумента функции push и с типом результата функции top?
Ну, от дизайна класса зависит как. Например, кто-то из них может быть ссылкой
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, igna, Вы писали:
E>>Ну, от дизайна класса зависит как. Например, кто-то из них может быть ссылкой I>В приведенном примере вроде никто.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Хочу разъяснить для себя некоторые вопросы. Когда пытаюсь сделать так:
интересно, с какого языка ты решила на Си перелезть?
XJ>в VS, то получаю ругань "error C2977: 'Stack' : too many template arguments", а если переименовываю второй класс в Stack2, то все ок.
XJ>1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать?
да.
XJ>2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?
template <typename T, template<typename> class CONT = std::vector>
class Stack
{
};
Не взлетит. Потому что шаблон std::vector имеет не менее двух параметров (помимо хранимого типа присутствует аллокатор). Разрешены и дополнительные параметры, нужные реализации STL, при условии, что для них заданы значения по умолчанию.
Здравствуйте, pvirk, Вы писали:
P>Здравствуйте, night beast, Вы писали:
NB>>интересно, с какого языка ты решила на Си перелезть? P>По постам очевидно, что с шарпа.
Вы не поверите... но такая дура, как я, умудряется учить эти два языка одновременно...
Здравствуйте, XJess, Вы писали:
NB>>>интересно, с какого языка ты решила на Си перелезть? P>>По постам очевидно, что с шарпа.
XJ>Вы не поверите... но такая дура, как я, умудряется учить эти два языка одновременно...
не верим у людей, которые начинают учить си без бэкграунда, таких вопросов обычно не возникает
а зачем сразу оба? не боишься что как в пословице получится?
Здравствуйте, 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;
};
Здравствуйте, night beast, Вы писали:
XJ>>Вы не поверите... но такая дура, как я, умудряется учить эти два языка одновременно...
NB>не верим у людей, которые начинают учить си без бэкграунда, таких вопросов обычно не возникает NB>а зачем сразу оба? не боишься что как в пословице получится?
У меня выбора нет — на нынешней работе надо писать на обоих. К тому же, меня окружают маньяки, которые постоянно капают на мозги, чтобы я их оба учила.
Здравствуйте, XJess, Вы писали:
XJ>У меня выбора нет — на нынешней работе надо писать на обоих. К тому же, меня окружают маньяки, которые постоянно капают на мозги, чтобы я их оба учила.
Вероятно, имеют ввиду, что выучить их надо оба. Но учить можно и последовательно.
XJ>в VS, то получаю ругань "error C2977: 'Stack' : too many template arguments", а если переименовываю второй класс в Stack2, то все ок.
XJ>1. Т. е. я правильно понимаю, что два таких шаблона класса нельзя создать? XJ>2. Кстати, почему-то пока не пытаюсь создать объект, то не ругается на то, что vector без типа у меня задан, хотя должно быть по идее vector<T>... Это тоже нормально?
1) Нельзя двум типам (классам) давать одно имя в общем пространстве имён.
2) Объявления классов, которые не используются в программе, компилятор игнорит.
quodum:
Q>Не взлетит. Потому что шаблон std::vector имеет не менее двух параметров (помимо хранимого типа присутствует аллокатор). Разрешены и дополнительные параметры, нужные реализации STL, при условии, что для них заданы значения по умолчанию.
Где именно стандарт разрешает дополнительные параметры?