Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.242.141] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Обломался на простенькой задаче:
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 |
Сообщ.
#2
,
|
|
|
Это глюк.
Borland C++ даже не скомпилил такой код. В шаблоне обязательно должен создаваться шаблонный объект, в данном случае Q Попробуй сделать так. Q d; return sizeof(d); тогда у меня заработало |
Сообщ.
#3
,
|
|
|
Круто! Спасибо.
А насчет "В шаблоне обязательно должен создаваться шаблонный объект" - это где-то оговорено? Я ничего такого не читал. Кстати, у меня давно и без проблем работает шаблон template< class STRUCT> inline void Ut_ZeroMemory( STRUCT *pStruct) { ZeroMemory( pStruct, sizeof (STRUCT)); } |
Сообщ.
#4
,
|
|
|
Да, это очень большой недочет.
Это говорилось только в одной книжке. Меня это бесит. А то, что указанный код работает, так ведь у тебя создается объект STRUCT как параметр функции. Присмотрись внимательнее, пусть даже и указатель. |
Сообщ.
#5
,
|
|
|
Ну, и ещё это нам препод в институте рассказывал. Он нам очень много полезных вич
дал, теперь и не знаю, что-бы без них делал. |
Сообщ.
#6
,
|
|
|
И вот ещё,самый отстойю.
Если ты в одном шаблоне делаешь сразу 2 или более шаблонных объектов, то для работы жизненно необходимо создавать ВСЕ шаблонныйе объекты. template < class Q ><class R> int Ut() { Q d; return sizeof ( d ); } Такая вещь не будет работать во многи случаях. Надо ещё дописывать что-нибудь про R |
Сообщ.
#7
,
|
|
|
Опаньки.
А это я вчера погорячился. Q d; не помогает. Код с ZeroMemory работает IMHO потому, что там указатель на объект типа STRUCT передается как обычный параметр функции. С такими конструкциями у шаблонов проблем я пока не находил. Так вот. Q d; с Microsoft Visual C++ 6.0 не помогает . Может быть дело в опциях компилятора или линкера? У меня все стоит дифалтное. |
Сообщ.
#8
,
|
|
|
В вижуале вот такой синтаксис придется применить, хотя тоже отстой полный, но работает:
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; } |
Сообщ.
#9
,
|
|
|
махонькая поправочка, конструкторы временных объектов можно вызывать пустые:
Ut(long()); |
Сообщ.
#10
,
|
|
|
а вот так попоробуй в свой вариант вставить:
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 |
Сообщ.
#11
,
|
|
|
а вообще начинаю смутно припоминать, что для шаблонных функций оговаривается, что по крайней мере один из параметров должен быть типа, описанного в параметрах шаблона. Ни у кого под рукой Страуструпа нету? Там это было.
|
Сообщ.
#12
,
|
|
|
Ты абсолютно прав, когда пишешь такой код:
template <class C> size_t SizeOf() { return sizeof(C); } И под Builder 5.0 все работает прекрасно. Потому что этот компилятор более близок к стандарту C++. А в Visual Studio - нет. По причине его несоответствия этому стандарту в некоторых случаях. Так что смотри, компилятор менять или подход в решении ;-). |
Сообщ.
#13
,
|
|
|
2Valery: Чёт не пойму у тя написано
cout << "sizeof(A) = " << Ut<char>() << endl; и соответсвенно sizeof(char) = 10 ЭТО КАК? Ведь ты даже нигде к A не обращаешься, только класс создаешь? Обрашаешься то к char?! Или я чёт не понимаю? |
Сообщ.
#14
,
|
|
|
ой, не оттуда строчки скопировал!
да Дел, ты прав, строка должна была быть cout << "sizeof(A) = " << Ut<A>() << endl; так и проверял, действительно в обоих случаях выдает размер 10 |
Сообщ.
#15
,
|
|
|
А почему? Ну ладно с классом А - там масиив чаровский на 10 элементов, логично. А лонг? Какого хр№на 10?
|