Не передается параметр template
От: potap  
Дата: 13.08.13 09:40
Оценка:
template <class A>
void PrintSz()
{
    TRACE("\n%d",sizeof(A));
};
...

PrintSz<char>();
PrintSz<short>();


Оба раза выдается 2! Если убираю второй вызов, выдается 1.
Visual Studio 6. Что за хрень?!
Re: Не передается параметр template
От: ArtDenis Россия  
Дата: 13.08.13 09:44
Оценка:
Здравствуйте, potap, Вы писали:

>Оба раза выдается 2! Если убираю второй вызов, выдается 1.

P>Visual Studio 6. Что за хрень?!

Баг в TRACE?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Не передается параметр template
От: jazzer Россия Skype: enerjazzer
Дата: 13.08.13 09:46
Оценка: +3 :))) :))
Здравствуйте, potap, Вы писали:

P>Visual Studio 6. Что за хрень?!


Полностью согласен.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Не передается параметр template
От: potap  
Дата: 13.08.13 09:57
Оценка:
AD>Баг в TRACE?
нет, TRACE нормально работает. По другим признакам (оператор ++ скачет по 2 байта) тоже видно что передается неправильный тип — short
Re: Не передается параметр template
От: Кодт Россия  
Дата: 13.08.13 11:22
Оценка: 2 (1)
Здравствуйте, potap, Вы писали:

P>Оба раза выдается 2! Если убираю второй вызов, выдается 1.

P>Visual Studio 6. Что за хрень?!

Именно эта хрень: VC6.
Там баг в компиляторе, который создаёт одинаковые декорированные имена для всех воплощений шаблона (а возможно, что и для всех специализаций — этого я уже не помню).
Поскольку шаблонные функции — инлайны, то линкер случайным образом оставляет один экземпляр из всех одинаково названных.

Чтобы побороть эту беду, нужно или слезть с шестёрки, или сделать так, чтобы у каждой функции была уникальная сигнатура. Например,
template<class A>
void PrintSz(A* dummy = 0)
{
  printf("\n%d", sizeof(A));
}

потому что сигнатуры, слава богу, учитываются при декорировании.

(Хотя и сигнатуры можно отринуть, если сделать extern "C" но это уже из серии — как назло всем прострелить себе ногу).
Перекуём баги на фичи!
Re[2]: Не передается параметр template
От: potap  
Дата: 13.08.13 12:02
Оценка:
К>Именно эта хрень: VC6.
К>Там баг в компиляторе,
К> уникальная сигнатура. Например,
К>
К>template<class A>
К>void PrintSz(A* dummy = 0)
К>{
К>  printf("\n%d", sizeof(A));
К>}
К>


прикольный обход
спасибо, так пожалуй и поступлю
Re[3]: Не передается параметр template
От: Кодт Россия  
Дата: 13.08.13 12:27
Оценка:
Здравствуйте, potap, Вы писали:

P>прикольный обход

P>спасибо, так пожалуй и поступлю

Есть ещё один способ: сделать функцию (статическим) членом класса.
Т.е. чтобы свободные параметры шаблона относились не к шаблону функции, а к шаблону класса
template<class A>
struct PrintSz
{
  static void doit() { ..... }; // имеет тип void()
  void operator() const { doit(); }
};

int main()
{
  void(* p[2] ) () = { PrintSz<char>::doit, PrintSz<short>::doit }; // однотипность пригодится, например, здесь
  PrintSz<int>()(); // а оператор - здесь: меньше букв, меньше идентификаторов
}
Перекуём баги на фичи!
Re: Не передается параметр template
От: rg45 СССР  
Дата: 13.08.13 13:09
Оценка:
Здравствуйте, potap, Вы писали:


P>
P>template <class A>
P>void PrintSz()
P>{
P>    TRACE("\n%d",sizeof(A));
P>};
P>...

P>PrintSz<char>();
P>PrintSz<short>();
P>


P>Оба раза выдается 2! Если убираю второй вызов, выдается 1.

P>Visual Studio 6. Что за хрень?!

Дык ведь это ж старая известная болячка msvc, которую толком починили только в 7.1(2003). Все дело в том, что в 6.0 параметры шаблонных функций не влияют на их сигнатуру. Поэтому в данном случае все работает по принципу "кто первый встал, того и тапки" (какая функция первой проинстанцировалась, та и будет использоваться дальше). Помнится, мы боролись с этим, добавляя фиктивный формальный параметр (как правило указатель соответствующего типа) со значением по умолчанию. Попробуй сделать так же:

template <class A>
void PrintSz(A* dummy = 0)
{
    TRACE("\n%d",sizeof(A));
};
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Не передается параметр template
От: rg45 СССР  
Дата: 13.08.13 13:15
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Именно эта хрень: VC6.

К>Там баг в компиляторе, который создаёт одинаковые декорированные имена для всех воплощений шаблона (а возможно, что и для всех специализаций — этого я уже не помню).
К>Поскольку шаблонные функции — инлайны, то линкер случайным образом оставляет один экземпляр из всех одинаково названных.

К>Чтобы побороть эту беду, нужно или слезть с шестёрки, или сделать так, чтобы у каждой функции была уникальная сигнатура. Например,

К>
К>template<class A>
К>void PrintSz(A* dummy = 0)
К>{
К>  printf("\n%d", sizeof(A));
К>}
К>


Упс! Пардон, не заметил вовремя твой пост. Забавно, что имена формальных параметров совпали
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Не передается параметр template
От: flаt  
Дата: 14.08.13 19:17
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Упс! Пардон, не заметил вовремя твой пост. Забавно, что имена формальных параметров совпали

Забавно, что можно вообще без них: void foo(A* =0)
Re[4]: Не передается параметр template
От: rg45 СССР  
Дата: 14.08.13 21:09
Оценка:
Здравствуйте, flаt, Вы писали:

R>>Упс! Пардон, не заметил вовремя твой пост. Забавно, что имена формальных параметров совпали

F>Забавно, что можно вообще без них: void foo(A* =0)

Это-то понятно, просто я не был уверен, что VC6.0 допускает такой синтаксис, времени-то порядочно прошло с тех пор.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.