Здравствуйте, potap, Вы писали:
P>Оба раза выдается 2! Если убираю второй вызов, выдается 1. P>Visual Studio 6. Что за хрень?!
Именно эта хрень: VC6.
Там баг в компиляторе, который создаёт одинаковые декорированные имена для всех воплощений шаблона (а возможно, что и для всех специализаций — этого я уже не помню).
Поскольку шаблонные функции — инлайны, то линкер случайным образом оставляет один экземпляр из всех одинаково названных.
Чтобы побороть эту беду, нужно или слезть с шестёрки, или сделать так, чтобы у каждой функции была уникальная сигнатура. Например,
Здравствуйте, 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>()(); // а оператор - здесь: меньше букв, меньше идентификаторов
}
P>Оба раза выдается 2! Если убираю второй вызов, выдается 1. P>Visual Studio 6. Что за хрень?!
Дык ведь это ж старая известная болячка msvc, которую толком починили только в 7.1(2003). Все дело в том, что в 6.0 параметры шаблонных функций не влияют на их сигнатуру. Поэтому в данном случае все работает по принципу "кто первый встал, того и тапки" (какая функция первой проинстанцировалась, та и будет использоваться дальше). Помнится, мы боролись с этим, добавляя фиктивный формальный параметр (как правило указатель соответствующего типа) со значением по умолчанию. Попробуй сделать так же:
Здравствуйте, Кодт, Вы писали:
К>Именно эта хрень: VC6. К>Там баг в компиляторе, который создаёт одинаковые декорированные имена для всех воплощений шаблона (а возможно, что и для всех специализаций — этого я уже не помню). К>Поскольку шаблонные функции — инлайны, то линкер случайным образом оставляет один экземпляр из всех одинаково названных.
К>Чтобы побороть эту беду, нужно или слезть с шестёрки, или сделать так, чтобы у каждой функции была уникальная сигнатура. Например, К>
Здравствуйте, rg45, Вы писали:
R>Упс! Пардон, не заметил вовремя твой пост. Забавно, что имена формальных параметров совпали
Забавно, что можно вообще без них: void foo(A* =0)
Здравствуйте, flаt, Вы писали:
R>>Упс! Пардон, не заметил вовремя твой пост. Забавно, что имена формальных параметров совпали F>Забавно, что можно вообще без них: void foo(A* =0)
Это-то понятно, просто я не был уверен, что VC6.0 допускает такой синтаксис, времени-то порядочно прошло с тех пор.
--
Не можешь достичь желаемого — пожелай достигнутого.