Этот прекрасный код вызывает у микрософтовского компилятора разрыв шаблона:
#include"string"template<class Type, class ObjectType, template<class> class Traits, template<class> class AllocatorType>
void ToString(const ObjectType & object, std::basic_string<Type, Traits<Type>, AllocatorType<Type> > * pStr)
{
}
template<class Type, template<class> class Traits, template<class> class AllocatorType>
void ToString(int object, std::basic_string<Type, Traits<Type>, AllocatorType<Type> > * pStr)
{
}
int main()
{
int val = 0;
std::string str;
ToString(val, &str);
return 0;
}
Попробовал на версиях 7.1, 9.0, 10.0, результат один и тот же:
d:\Projects\test\main.cpp(17) : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 2701)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Самое прекрасное в этом баге то, что если поменять местами в первой функции Type и ObjectType местами, например, так:
template<class ObjectType, class Type, template<class> class Traits, template<class> class AllocatorType>
void ToString(const ObjectType & object, std::basic_string<Type, Traits<Type>, AllocatorType<Type> > * pStr) ..
то он воспроизводиться не будет.
Форму, куда сабмитить баг я вроде бы нашел.
Но у меня возник вопрос, может его уже кто-то сабмитил? можно ли где-то посмотреть список багов на MS С++ компиляторы?
26.05.10 16:56: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Viva el Junta Militar! Viva el Presidente!
Re: [All VС versions] fatal error C1001: INTERNAL COMPILER E
Здравствуйте, Ligen, Вы писали:
L>Этот прекрасный код вызывает у микрософтовского компилятора разрыв шаблона:
Попробовал сделать дистиллированный код
template<class T> struct tr {};
template<class C, class Tr=tr<C> > struct str {};
template<class C, class SRC, template<class> class TR>
void tostring(const SRC& src, str< C,TR<C> >* dst)
{}
template<class C, template<class> class TR>
void tostring(int src, str< C,TR<C> >* dst)
{}
int main()
{
int src = 0;
str<char> dst;
tostring(src, &dst);
return 0;
}
ICE воспроизводится.
Пропадает, если
— в первой перегрузке tostring(SRC,...) вынести class SRC первым параметром
— перегрузку tostring(int,...) перетащить выше tostring(SRC,...)
— убрать любую из перегрузок
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Кодт, Вы писали:
CS>Николай, а что точно есть такое
CS>
CS>template<class> class TR
CS>
CS>?
Извините, что вклиниваюсь, это называется шаблонный параметр шаблона, и описан он в действующем стандарте языка в 14.3.3 — Template template arguments.
--
Справедливость выше закона. А человечность выше справедливости.
CS>>? R>Извините, что вклиниваюсь, это называется шаблонный параметр шаблона, и описан он в действующем стандарте языка в 14.3.3 — Template template arguments.
Круто. Думаю я так что пора ужо мне в Немерлисты записываться ...
CS>>>? R>>Извините, что вклиниваюсь, это называется шаблонный параметр шаблона, и описан он в действующем стандарте языка в 14.3.3 — Template template arguments. CS>Круто. Думаю я так что пора ужо мне в Немерлисты записываться ...
Думаете полегчает?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, c-smile, Вы писали:
CS>>Круто. Думаю я так что пора ужо мне в Немерлисты записываться ...
К>Зря. Там тебя поджидают макросы.
Ну тогда в brainfuckers стройными рядами ...
Надо Влада2d уговорить еще для компании. Председателем. Главным так сказать... Ну и Кочеткова с его медальками...
А вот интересно как медалька этого клуба будет выглядеть ...
У-у-у... Так... господ гусаров просьба не беспокоить...
Здравствуйте, dmitry_npi, Вы писали:
_>Я прошу прощения (за оффтопик), но этот код даже у людей вызывает разрыв шаблона...
Да ладно, вполне читаемый код. После десятка лет практики...