На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Кто знает С++ ? :)
    Обломался на простенькой задаче:

    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
      Это глюк.
      Borland C++ даже не скомпилил такой код.
      В шаблоне обязательно должен создаваться шаблонный объект, в данном случае Q
      Попробуй сделать так.
      Q d;
      return sizeof(d);
      тогда у меня заработало
        Круто! Спасибо.
        А насчет "В шаблоне обязательно должен создаваться шаблонный объект" - это где-то оговорено? Я ничего такого не читал.
        Кстати, у меня давно и без проблем работает шаблон
        template< class STRUCT> inline void Ut_ZeroMemory( STRUCT *pStruct)
        {
        ZeroMemory( pStruct, sizeof (STRUCT));
        }
          Да, это очень большой недочет.
          Это говорилось только в одной книжке.
          Меня это бесит. А то, что указанный код работает, так ведь у тебя создается
          объект STRUCT как параметр функции.
          Присмотрись внимательнее, пусть даже и указатель.
            Ну, и ещё это нам препод в институте рассказывал. Он нам очень много полезных вич
            дал, теперь и не знаю, что-бы без них делал.
              И вот ещё,самый отстойю.
              Если ты в одном шаблоне делаешь сразу 2 или более шаблонных объектов, то для работы жизненно необходимо создавать ВСЕ шаблонныйе объекты.
              template < class Q ><class R> int Ut()
              {
              Q d;
              return sizeof ( d );
              }
              Такая вещь не будет работать во многи случаях.
              Надо ещё дописывать что-нибудь про R
                Опаньки.
                А это я вчера погорячился.
                Q d;
                не помогает. :(
                Код с ZeroMemory работает IMHO потому, что там указатель на объект типа STRUCT передается как обычный параметр функции. С такими конструкциями у шаблонов проблем я пока не находил.
                Так вот. Q d; с Microsoft Visual C++ 6.0 не помогает :(. Может быть дело в опциях компилятора или линкера? У меня все стоит дифалтное.
                  В вижуале вот такой синтаксис придется применить, хотя тоже отстой полный, но работает:
                  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;
                  }
                    махонькая поправочка, конструкторы временных объектов можно вызывать пустые:
                    Ut(long());
                      а вот так попоробуй в свой вариант вставить:
                      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
                        а вообще начинаю смутно припоминать, что для шаблонных функций оговаривается, что по крайней мере один из параметров должен быть типа, описанного в параметрах шаблона. Ни у кого под рукой Страуструпа нету? Там это было.
                          Ты абсолютно прав, когда пишешь такой код:
                          template <class C> size_t SizeOf()
                          {
                          return sizeof(C);
                          }
                          И под Builder 5.0 все работает прекрасно. Потому что этот компилятор более близок к стандарту C++. А в Visual Studio - нет. По причине его несоответствия этому стандарту в некоторых случаях. Так что смотри, компилятор менять или подход в решении ;-).
                            2Valery: Чёт не пойму у тя написано
                            cout << "sizeof(A) = " << Ut<char>() << endl;
                            и соответсвенно sizeof(char) = 10
                            ЭТО КАК? Ведь ты даже нигде к A не обращаешься, только класс создаешь? Обрашаешься то к char?! Или я чёт не понимаю?
                              ой, не оттуда строчки скопировал!
                              да Дел, ты прав, строка должна была быть
                              cout << "sizeof(A) = " << Ut<A>() << endl;
                              так и проверял, действительно в обоих случаях выдает размер 10
                                А почему? Ну ладно с классом А - там масиив чаровский на 10 элементов, логично. А лонг? Какого хр№на 10?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1030 ]   [ 16 queries used ]   [ Generated: 5.05.24, 05:31 GMT ]