Rad
|
delinquent guy
|
|
|
|
Рег.: 06.09.2005
|
Сообщений: 17290
|
Из: here and there
|
Рейтинг: 2232
|
|
C++: typedef для template class'ов
04.12.2008 15:29
|
|
|
Вот такой код: code: template <typename c>
class a
{
static c value;
};
typedef a<double> doublea;
double doublea::value = 1.25;
int main(void)
{
}
нормально собирается студией, но gcc выдает ошибку при сборке: code: 1.cc:8: error: too few template-parameter-lists
Если перед "double doublea::value = 1.25;" дописать "template<>", все нормально собирается.
Вопрос следующий: зачем это нужно? И какой пример можно привести, в котором без "template<>" смысл кода будет другим?
|
|
|
Spin
|
он самый
|
|
|
|
Рег.: 17.09.2003
|
Сообщений: 14521
|
|
Рейтинг: 4387
|
|
Re: C++: typedef для template class'ов
[re: Rad]
04.12.2008 23:49
|
|
|
чо-то мне так кажется, что студия налажала
|
- а этот ваш С++ - он функциональный? - еще какой функциональный! |
|
Rad
|
delinquent guy
|
|
|
|
Рег.: 06.09.2005
|
Сообщений: 17290
|
Из: here and there
|
Рейтинг: 2232
|
|
Re: C++: typedef для template class'ов
[re: Spin]
05.12.2008 00:15
|
|
|
В ответ на:
чо-то мне так кажется, что студия налажала
Я точно знаю, что студия в данном случае забивает на несовместимость со стандартом (кстати, компилятор Comeau внятно об этом сообщил, в отличие от gcc).
Мне просто интересно, какой смысл в этом... Раньше мне казалось, что подобные вещи существуют для того, чтобы не перепутать данную конструкцию с чем-то еще. В данном случае я не могу придумать конструкции, которую можно было бы спутать с этой. Я даже не про typedef, а про: template<> mytype mytemplate<myparam> static_var = ...;
|
|
|
Misha
|
addict
|
|
|
|
Рег.: 29.08.2002
|
Сообщений: 600
|
|
Рейтинг: 63
|
|
Re: C++: typedef для template class'ов
[re: Rad]
09.12.2008 09:53
|
|
|
[ Домыслы, стандарта не знаю ] Видимо, компиляторы по разному решают, когда класс a<double> необходимо инстанциировать. Конструкция code: typedef a<double> doublea;
- лишь сокращение, к инстанциации шаблона отношения не имеет (хотя 6-я вижуал студия думала иначе ). Видимо, встретив определение члена a<double>::value, майкрософтовский компилятор решил, что пора бы уж заодно и класс a<double> инстанциировать. А гнушный компилятор решил, что это не порядок, поскольку класc a<double> не был инcтанциирован, а значит и объявления члена a<double>::value как бы не было. А магическое "template<>" и означает инстанциацию. [/ Домыслы, стандарта не знаю ]
Интересно, а если для гнушного компилятора вставить строку code: template<> class a<double>;
перед code: double doublea::value = 1.25;
то скомпилируется?
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
Re: C++: typedef для template class'ов
[re: Misha]
09.12.2008 11:37
|
|
|
В ответ на:
Интересно, а если для гнушного компилятора вставить строку
В ответ на:
template_typedef.cpp:9: ошибка: invalid use of undefined type 'class a<double>' template_typedef.cpp:3: ошибка: declaration of 'class a<double>'
Вообще правильно инстанциировать шаблон конструкцией code: template class a<double>;
, но даже после этого строчка code: double doublea::value = 1.25;
не компилируется без template<> в начале с той же ошибкой, что и в первом посте. Так что, похоже, дело тут не совсем в инстанцировании шаблона.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|
___
|
■
|
|
|
|
Рег.: 27.11.2003
|
Сообщений: 1632
|
|
Рейтинг: 44
|
|
Re: C++: typedef для template class'ов
[re: Rad]
10.12.2008 00:18
|
|
|
typedef-ом ты компилятор не обманешь :3
'double doublea::value = 1.25;' - это определение члена явно специализированного a<double>, к твоему value оно не имеет никакого отношения
code: template <typename c>
class a
{
static c value; // 1
};
template<>
class a<double>
{
static double value; // 2
};
typedef a<double> doublea;
double doublea::value = 1.25; // определение 2
int main(void)
{
}
а вот 'template<> double doublea::value = 1.25;' суть явная специализация члена еще не специализированного под дабл шаблона, которая потянет за собой автоштамповку a<double>
т.к. явный и автоматический a<double> исключают друг друга, спутать их невозможно
с и без 'template<>' смысл всегда разный, а вот придумать пример, когда оба варианта компилятся, но с разным результатом мне влом
|
|
Rad
|
delinquent guy
|
|
|
|
Рег.: 06.09.2005
|
Сообщений: 17290
|
Из: here and there
|
Рейтинг: 2232
|
|
Re: C++: typedef для template class'ов
[re: ___]
10.12.2008 15:59
|
|
|
В ответ на:
с и без 'template<>' смысл всегда разный, а вот придумать пример, когда оба варианта компилятся, но с разным результатом мне влом
Если в этот код добавить code: template<> double doublea::value = 3.0;
студия выдает: В ответ на:
error C2998: 'double a<double>::value' : cannot be a template definition
ну и, по большому счету, мне кажется, что использование таких возможностей вносило бы лишнюю путаницу.
|
|
|