WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Кто знает С++ ? :)

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Кто знает С++ ? :)
Mmm2 опубликован 18-02-2002 20:14 MSK   Click Here to See the Profile for Mmm2   Click Here to Email Mmm2  
Обломался на простенькой задаче:


template < class Q > int Ut()
{
return sizeof ( Q );
}


int main(int argc, char* argv[])
{
cout << "sizeof(long) = " << Ut<long>() << endl;
cout << "sizeof(char) = " << Ut<char>() << endl;
}

Ожидал получить 4 1
получил 1 1

Microsoft Visual C++ 6.0

Muran опубликован 18-02-2002 21:55 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
Это глюк.
Borland C++ даже не скомпилил такой код.
В шаблоне обязательно должен создаваться шаблонный объект, в данном случае Q
Попробуй сделать так.
Q d;
return sizeof(d);

тогда у меня заработало

Mmm2 опубликован 18-02-2002 22:18 MSK     Click Here to See the Profile for Mmm2  Click Here to Email Mmm2     
Круто! Спасибо.

А насчет "В шаблоне обязательно должен создаваться шаблонный объект" - это где-то оговорено? Я ничего такого не читал.

Кстати, у меня давно и без проблем работает шаблон

template< class STRUCT> inline void Ut_ZeroMemory( STRUCT *pStruct)
{
ZeroMemory( pStruct, sizeof (STRUCT));
}

Muran опубликован 19-02-2002 00:31 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
Да, это очень большой недочет.
Это говорилось только в одной книжке.
Меня это бесит. А то, что указанный код работает, так ведь у тебя создается
объект STRUCT как параметр функции.
Присмотрись внимательнее, пусть даже и указатель.
Muran опубликован 19-02-2002 00:34 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
Ну, и ещё это нам препод в институте рассказывал. Он нам очень много полезных вич
дал, теперь и не знаю, что-бы без них делал.
Muran опубликован 19-02-2002 00:45 MSK     Click Here to See the Profile for Muran  Click Here to Email Muran     
И вот ещё,самый отстойю.
Если ты в одном шаблоне делаешь сразу 2 или более шаблонных объектов, то для работы жизненно необходимо создавать ВСЕ шаблонныйе объекты.

template < class Q ><class R> int Ut()
{
Q d;
return sizeof ( d );
}

Такая вещь не будет работать во многи случаях.
Надо ещё дописывать что-нибудь про R


Mmm2 опубликован 19-02-2002 09:56 MSK     Click Here to See the Profile for Mmm2  Click Here to Email Mmm2     
Опаньки.
А это я вчера погорячился.

Q d;
не помогает. :(

Код с ZeroMemory работает IMHO потому, что там указатель на объект типа STRUCT передается как обычный параметр функции. С такими конструкциями у шаблонов проблем я пока не находил.

Так вот. Q d; с Microsoft Visual C++ 6.0 не помогает :(. Может быть дело в опциях компилятора или линкера? У меня все стоит дифалтное.

Valery опубликован 19-02-2002 00:28 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
В вижуале вот такой синтаксис придется применить, хотя тоже отстой полный, но работает:

template < class Q >
int Ut(Q dummy)
{
return sizeof (Q);
}


int main(int argc, char* argv[])
{
cout << "sizeof(long) = " << Ut(long(0)) << endl;
cout << "sizeof(char) = " << Ut(char(0)) << endl;

return 0;
}

Valery опубликован 19-02-2002 00:31 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
махонькая поправочка, конструкторы временных объектов можно вызывать пустые:
Ut(long());
Valery опубликован 19-02-2002 00:46 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
а вот так попоробуй в свой вариант вставить:
class A
{
char ch[10];
public:
A(const char *) {}
};

и соответственно
int main(int argc, char* argv[])
{
cout << "sizeof(long) = " << Ut<long>() << endl;
cout << "sizeof(A) = " << Ut<char>() << endl;
}

у меня в результате получилось вообще ужас как:

sizeof(long) = 10
sizeof(char) = 10


Valery опубликован 19-02-2002 13:23 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
а вообще начинаю смутно припоминать, что для шаблонных функций оговаривается, что по крайней мере один из параметров должен быть типа, описанного в параметрах шаблона. Ни у кого под рукой Страуструпа нету? Там это было.
sps опубликован 19-02-2002 14:14 MSK     Click Here to See the Profile for sps  Click Here to Email sps     
Ты абсолютно прав, когда пишешь такой код:
template <class C> size_t SizeOf()
{
return sizeof(C);
}
И под Builder 5.0 все работает прекрасно. Потому что этот компилятор более близок к стандарту C++. А в Visual Studio - нет. По причине его несоответствия этому стандарту в некоторых случаях. Так что смотри, компилятор менять или подход в решении ;-).
Del опубликован 19-02-2002 15:10 MSK     Click Here to See the Profile for Del  Click Here to Email Del     
2Valery: Чёт не пойму у тя написано
cout << "sizeof(A) = " << Ut<char>() << endl;
и соответсвенно sizeof(char) = 10
ЭТО КАК? Ведь ты даже нигде к A не обращаешься, только класс создаешь? Обрашаешься то к char?! Или я чёт не понимаю?
Valery опубликован 19-02-2002 16:22 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
ой, не оттуда строчки скопировал!
да Дел, ты прав, строка должна была быть
cout << "sizeof(A) = " << Ut<A>() << endl;

так и проверял, действительно в обоих случаях выдает размер 10


Del опубликован 22-02-2002 17:04 MSK     Click Here to See the Profile for Del  Click Here to Email Del     
А почему? Ну ладно с классом А - там масиив чаровский на 10 элементов, логично. А лонг? Какого хр№на 10?
Valery опубликован 25-02-2002 10:15 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
а что этот форум еще жив? хе-хе.
ну пока нас purple отсюда не турнул, можно тут.
2Del:
просто попробуй сам, увидишь. лажается вообщем вижуал на таком примере. и если очень интересно обсуждать эту тему дальше, то может ее на новом форуме подънять?
2purple:
этот форум все-равно приятнее выглядит. :(
Valery опубликован 25-02-2002 10:19 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2purpe:
сорри за искажение твоего ника.
чтоб мне лучше запомнить, может пояснишь что он означает (можно мылом или на аналогичный мой ник на новом форуме)

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.