Возник такой вопрос: почему компилятор не может вывести тип при создании экземпляра шаблонного класса так же, как он делает при вызове шаблонной функции?
А потому, что конструктор может быть совершенно любой. И только в одном конкретном случае — когда одним из аргументов конструктора является переменная типа шаблона, можно выполнить автоматическое выведение. Ты хочешь, чтобы компилятор внимательно изучал сигнатуру конструктора и смотрел, не принимает ли он какой-нибудь параметр шаблонного типа? Этого не будет.
Да здравствует мыло душистое и веревка пушистая.
Re: Определение типа при создании экз. шаблонного класса
От:
Аноним
Дата:
25.05.04 07:49
Оценка:
А как быть с конструктором по умолчанию? А как быть с конструктором шаблоном? А как быть с конструктором, который выводит не все типы? Далее, YourMegaFicha a(10); YourMegaFicha b(10.) как пользователь твоей программы должен будет различать, а и b одного типа или нет?
Re: Определение типа при создании экз. шаблонного класса
Здравствуйте, RobinBobin, Вы писали:
RB>Возник такой вопрос: почему компилятор не может вывести тип при создании экземпляра шаблонного класса так же, как он делает при вызове шаблонной функции?
Я тут Страуструпа читал....
Обратите внимание, что параметры шаблона класса(в отличие от шаблона функции) никогда не выводятся. Причина заключается в том, что гибкость, обеспечиваемая наличием нескольких конструкторов класса, во многих случаях является непреодолимым препятствием на пути такого выведения, и еще в большем числе случаев выведение неоднозначно.
То есть, объект класса можно создать очень по-разному, и создатели языка побоялись неоднозначностей и запутанностей, которые могут из-за этого возникнуть.
Re[2]: Определение типа при создании экз. шаблонного класса
Здравствуйте, Vamp, Вы писали:
V>А потому, что конструктор может быть совершенно любой. И только в одном конкретном случае — когда одним из аргументов конструктора является переменная типа шаблона, можно выполнить автоматическое выведение. Ты хочешь, чтобы компилятор внимательно изучал сигнатуру конструктора и смотрел, не принимает ли он какой-нибудь параметр шаблонного типа? Этого не будет.
Да, хочу .
Re[2]: Определение типа при создании экз. шаблонного класса
Здравствуйте, Juny, Вы писали:
J>Я тут Страуструпа читал....
J>
J>Обратите внимание, что параметры шаблона класса(в отличие от шаблона функции) никогда не выводятся. Причина заключается в том, что гибкость, обеспечиваемая наличием нескольких конструкторов класса, во многих случаях является непреодолимым препятствием на пути такого выведения, и еще в большем числе случаев выведение неоднозначно.
Супер! Спасибо! К сожалению, Страуструпа не было под рукой . Дома есть, а на работе нет. Все тащить лень .
Robin
Re[3]: Определение типа при создании экз. шаблонного класса
Здравствуйте, Lorenzo_LAMAS, Вы писали:
RB>>Да, хочу .
L_L>Так Бог в помощь. Напиши свой компилятор, продемонстрируй достоинства твоего расширения и пиши в комитет по расширениям языка.
.
Просто всегда хочется, чтобы компилятор тебя понимал и угадывал все твои желания.
Re[2]: Определение типа при создании экз. шаблонного класса
Здравствуйте, Juny, Вы писали:
J>Здравствуйте, RobinBobin, Вы писали:
RB>>Возник такой вопрос: почему компилятор не может вывести тип при создании экземпляра шаблонного класса так же, как он делает при вызове шаблонной функции?
J>Я тут Страуструпа читал....
J>
J>Обратите внимание, что параметры шаблона класса(в отличие от шаблона функции) никогда не выводятся. Причина заключается в том, что гибкость, обеспечиваемая наличием нескольких конструкторов класса, во многих случаях является непреодолимым препятствием на пути такого выведения, и еще в большем числе случаев выведение неоднозначно.
Также добавлю, что этой теме посвящена глава книги Д.Вандевурда "Шаблоны С++"
13.15 Initializer Deduction
It is often said that "programmers are lazy," and sometimes this refers to our desire to keep programmatic notation compact. Consider, in that respect, the following declaration:
std::map<std::string, std::list<int> >* dict
= new std::map<std::string, std::list<int> >;
This is verbose, and in practice we would (and most likely should) introduce a typedef synonym for the type. However, there is something redundant in this declaration: We specify the type of dict, but it is also implicit in the type of its initializer. Wouldn't it be considerably more elegant to be able to write an equivalent declaration with only one type specification? For example:
dcl dict = new std::map<std::string, std::list<int> >;
In this last declaration, the type of a variable is deduced from the type of the initializer. A keyword (dcl in the example, but var, let, and even auto have been proposed as alternatives) is needed to make the declaration distinguishable from an ordinary assignment.
So far, this isn't a template-only issue. In fact, it appears such a construct was accepted by a very early version of the Cfront compiler (in 1982, before templates came on the scene). However, it is the verbosity of many template-based types that increases the demand for this feature.
One could also imagine partial deduction in which only the arguments of a template must be deduced:
std::list<> index = create_index();
Another variant of this is to deduce the template arguments from the constructor arguments. For example:
template <typename T>
class Complex {
public:
Complex(T const& re, T const& im);
…
};
Complex<> z(1.0, 3.0); // deduces T = double
Precise specifications for this kind of deduction are made more complicated by the possibility of overloaded constructors, including constructor templates. Suppose, for example, that our Complex template contains a constructor template in addition to a normal copy constructor:
template <typename T>
class Complex {
public:
Complex(Complex<T> const&);
template <typename T2> Complex(Complex<T2> const&);
…
};
Complex<double> j(0.0, 1.0);
Complex<> z = j; // Which constructor was intended?
In the latter initialization, it is probable that the regular copy constructor was intended; hence z should have the same type as j. However, making it an implicit rule to ignore constructor templates may be overly bold.
Re: Определение типа при создании экз. шаблонного класса
Здравствуйте, RobinBobin, Вы писали:
RB>Возник такой вопрос: почему компилятор не может вывести тип при создании экземпляра шаблонного класса так же, как он делает при вызове шаблонной функции?
Увы тебе, это (имхо) даже стандартом не предусмотрено.
RB>
Если arr — временный объект, то можно использовать производящие функции:
template<class T>
ARRAY<T> makearray(T* buf, int size) // вывели тип и сконструировали объект
{
return ARRAY<T>(buf,size);
}
ЗЫ.
Нехорошо давать классам ИМЕНА — обычно так обозначают макросы и винапишные типы (последее идёт по традиции, опять-таки от макросов).
Перекуём баги на фичи!
Re[2]: Определение типа при создании экз. шаблонного класса
От:
Аноним
Дата:
25.05.04 09:33
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Если arr — временный объект, то можно использовать производящие функции:
Да, спасибо! Это я не подумал .
К>ЗЫ. К>Нехорошо давать классам ИМЕНА — обычно так обозначают макросы и винапишные типы (последее идёт по традиции, опять-таки от макросов).
Не, я только структурам даю. Или тоже плохо? Хотя разница между структурой и классом...
Re[2]: Определение типа при создании экз. шаблонного класса
> К>Нехорошо давать классам ИМЕНА — обычно так обозначают макросы и винапишные типы (последее идёт по традиции, опять-таки от макросов). > > Не, я только структурам даю. Или тоже плохо?
Да, поучительно! Даже не знаю, что сказать. Просто я в своё время решил, что свои структуры буду именовать по подобию АПИшных... Видать, неправильно решил
Robin
Re[3]: Определение типа при создании экз. шаблонного класса
Здравствуйте, Сергей Зизев, Вы писали:
СЗ>Также добавлю, что этой теме посвящена глава книги Д.Вандевурда "Шаблоны С++"
СЗ>[q] СЗ>13.15 Initializer Deduction
СЗ>It is often said that "programmers are lazy," and sometimes this refers to our desire to keep programmatic notation compact. Consider, in that respect, the following declaration:
СЗ>[]
На русском писать надо!!!! Книжка давно уже вышла из печати. И даже рецензия на нее леждит на сайте.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Определение типа при создании экз. шаблонного класса
Hello, LaptevVV!
You wrote on Tue, 25 May 2004 15:24:48 GMT:
[skipped...]
L> На русском писать надо!!!! Книжка давно уже вышла из печати. И даже рецензия на нее леждит на сайте.
У меня нет русского варианта в электронном виде.
WBR
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[4]: Определение типа при создании экз. шаблонного класса
Hello, LaptevVV!
You wrote on Tue, 25 May 2004 15:24:48 GMT:
[skipped...]
L> На русском писать надо!!!! Книжка давно уже вышла из печати. И даже рецензия на нее леждит на сайте.
У меня нет русского варианта в электронном виде.