Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=8150423&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 09:40:00 2016
Кодировка: Windows-1251
C++: typedef для template class'ов - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
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
4

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




ну и, по большому счету, мне кажется, что использование таких возможностей вносило бы лишнюю путаницу.



Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в