Автор
|
Тема: Кто знает С++ ? :)
|
Mmm2 |
опубликован 18-02-2002 20:14 MSK
Обломался на простенькой задаче: 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
Это глюк. Borland C++ даже не скомпилил такой код. В шаблоне обязательно должен создаваться шаблонный объект, в данном случае Q Попробуй сделать так. Q d; return sizeof(d);тогда у меня заработало |
Mmm2
|
опубликован 18-02-2002 22:18 MSK
Круто! Спасибо.А насчет "В шаблоне обязательно должен создаваться шаблонный объект" - это где-то оговорено? Я ничего такого не читал. Кстати, у меня давно и без проблем работает шаблон template< class STRUCT> inline void Ut_ZeroMemory( STRUCT *pStruct) { ZeroMemory( pStruct, sizeof (STRUCT)); } |
Muran
|
опубликован 19-02-2002 00:31 MSK
Да, это очень большой недочет. Это говорилось только в одной книжке. Меня это бесит. А то, что указанный код работает, так ведь у тебя создается объект STRUCT как параметр функции. Присмотрись внимательнее, пусть даже и указатель. |
Muran
|
опубликован 19-02-2002 00:34 MSK
Ну, и ещё это нам препод в институте рассказывал. Он нам очень много полезных вич дал, теперь и не знаю, что-бы без них делал. |
Muran
|
опубликован 19-02-2002 00:45 MSK
И вот ещё,самый отстойю. Если ты в одном шаблоне делаешь сразу 2 или более шаблонных объектов, то для работы жизненно необходимо создавать ВСЕ шаблонныйе объекты.template < class Q ><class R> int Ut() { Q d; return sizeof ( d ); } Такая вещь не будет работать во многи случаях. Надо ещё дописывать что-нибудь про R
|
Mmm2
|
опубликован 19-02-2002 09:56 MSK
Опаньки. А это я вчера погорячился. Q d; не помогает. :( Код с ZeroMemory работает IMHO потому, что там указатель на объект типа STRUCT передается как обычный параметр функции. С такими конструкциями у шаблонов проблем я пока не находил. Так вот. Q d; с Microsoft Visual C++ 6.0 не помогает :(. Может быть дело в опциях компилятора или линкера? У меня все стоит дифалтное.
|
Valery
|
опубликован 19-02-2002 00:28 MSK
В вижуале вот такой синтаксис придется применить, хотя тоже отстой полный, но работает: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
махонькая поправочка, конструкторы временных объектов можно вызывать пустые: Ut(long()); |
Valery
|
опубликован 19-02-2002 00:46 MSK
а вот так попоробуй в свой вариант вставить: 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
а вообще начинаю смутно припоминать, что для шаблонных функций оговаривается, что по крайней мере один из параметров должен быть типа, описанного в параметрах шаблона. Ни у кого под рукой Страуструпа нету? Там это было. |
sps
|
опубликован 19-02-2002 14:14 MSK
Ты абсолютно прав, когда пишешь такой код: template <class C> size_t SizeOf() { return sizeof(C); } И под Builder 5.0 все работает прекрасно. Потому что этот компилятор более близок к стандарту C++. А в Visual Studio - нет. По причине его несоответствия этому стандарту в некоторых случаях. Так что смотри, компилятор менять или подход в решении ;-).
|
Del
|
опубликован 19-02-2002 15:10 MSK
2Valery: Чёт не пойму у тя написано cout << "sizeof(A) = " << Ut<char>() << endl; и соответсвенно sizeof(char) = 10 ЭТО КАК? Ведь ты даже нигде к A не обращаешься, только класс создаешь? Обрашаешься то к char?! Или я чёт не понимаю? |
Valery
|
опубликован 19-02-2002 16:22 MSK
ой, не оттуда строчки скопировал! да Дел, ты прав, строка должна была быть cout << "sizeof(A) = " << Ut<A>() << endl;так и проверял, действительно в обоих случаях выдает размер 10
|
Del
|
опубликован 22-02-2002 17:04 MSK
А почему? Ну ладно с классом А - там масиив чаровский на 10 элементов, логично. А лонг? Какого хр№на 10? |
Valery
|
опубликован 25-02-2002 10:15 MSK
а что этот форум еще жив? хе-хе. ну пока нас purple отсюда не турнул, можно тут. 2Del: просто попробуй сам, увидишь. лажается вообщем вижуал на таком примере. и если очень интересно обсуждать эту тему дальше, то может ее на новом форуме подънять? 2purple: этот форум все-равно приятнее выглядит. :( |
Valery
|
опубликован 25-02-2002 10:19 MSK
2purpe: сорри за искажение твоего ника. чтоб мне лучше запомнить, может пояснишь что он означает (можно мылом или на аналогичный мой ник на новом форуме) |