Re: шаблонные виртуальные функции
От: jazzer Россия Skype: enerjazzer
Дата: 04.02.04 13:52
Оценка: 1 (1)
Здравствуйте, Slick, Вы писали:

S>Коллеги!


S>Чем объясняется наличие в Стандарте запрета на использование шаблонных виртуальных функций-членов?


S>Сложность реализации поддержки компилятором? Или языковые коллизии?


и то, и другое.
сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.

языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?
А если ты вдобавок еще перекроешь в классе С (наследнике В) общий шаблон, а зовешь опять через ссылку на А, что должно зваться — специализация из В (как более специализированная) или общая из С (как более поздняя)?
И т.д.
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: шаблонные виртуальные функции
От: WolfHound  
Дата: 04.02.04 12:09
Оценка: +1
Здравствуйте, Slick, Вы писали:

S>Сложность реализации поддержки компилятором? Или языковые коллизии?

Тем что это практически не возможно реализовать.
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
шаблонные виртуальные функции
От: Slick Украина  
Дата: 04.02.04 11:55
Оценка:
Коллеги!

Чем объясняется наличие в Стандарте запрета на использование шаблонных виртуальных функций-членов?

Сложность реализации поддержки компилятором? Или языковые коллизии?
Re: шаблонные виртуальные функции
От: Lorenzo_LAMAS  
Дата: 04.02.04 12:22
Оценка:
Представь традиционное реализацию с использованием таблицы виртуальных функций и ее РАЗМЕР в случае возможности существовани шаблонной виртуальной функции.
Of course, the code must be complete enough to compile and link.
Re[2]: шаблонные виртуальные функции
От: Slick Украина  
Дата: 04.02.04 14:01
Оценка:
Здравствуйте, jazzer, Вы писали:

S>>Сложность реализации поддержки компилятором? Или языковые коллизии?


J>и то, и другое.

J>сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.

J>языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?


Должен вызываться метод класса А, со значением параметра шаблона, переданного при вызове.
Re[3]: шаблонные виртуальные функции
От: LaptevVV Россия  
Дата: 04.02.04 14:03
Оценка:
Здравствуйте, Slick, Вы писали:

S>Здравствуйте, jazzer, Вы писали:


S>>>Сложность реализации поддержки компилятором? Или языковые коллизии?


J>>и то, и другое.

J>>сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.

J>>языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?


S>Должен вызываться метод класса А, со значением параметра шаблона, переданного при вызове.


Ага, а параметр шаблона — это только при компиляции, а не при выполнении
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: шаблонные виртуальные функции
От: jazzer Россия Skype: enerjazzer
Дата: 04.02.04 14:11
Оценка:
Здравствуйте, Slick, Вы писали:

S>Здравствуйте, jazzer, Вы писали:


S>>>Сложность реализации поддержки компилятором? Или языковые коллизии?


J>>и то, и другое.

J>>сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.

J>>языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?


S>Должен вызываться метод класса А, со значением параметра шаблона, переданного при вызове.


Не хотел писать код, но, видимо, придется иллюстрировать:
class A
{
  template <class T> virtual void f(T);
}

class B : public A
{
  template <> virtual void f(int);
}

class С : public B
{
  template <class T> virtual void f(T);
}

int main()
{
  B b;
  b.f(5); // что должно позваться?
  A& ra = b;
  ra.f(5); // a здесь?

  C c;
  c.f(5); // что должно позваться?
  B& rb = c;
  rb.f(5); // a здесь?
  A& ra = c;
  ra.f(5); // a здесь?
}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.