Здравствуйте, Slick, Вы писали:
S>Коллеги!
S>Чем объясняется наличие в Стандарте запрета на использование шаблонных виртуальных функций-членов?
S>Сложность реализации поддержки компилятором? Или языковые коллизии?
и то, и другое.
сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.
языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?
А если ты вдобавок еще перекроешь в классе С (наследнике В) общий шаблон, а зовешь опять через ссылку на А, что должно зваться — специализация из В (как более специализированная) или общая из С (как более поздняя)?
И т.д.
Представь традиционное реализацию с использованием таблицы виртуальных функций и ее РАЗМЕР в случае возможности существовани шаблонной виртуальной функции.
Of course, the code must be complete enough to compile and link.
Здравствуйте, jazzer, Вы писали:
S>>Сложность реализации поддержки компилятором? Или языковые коллизии?
J>и то, и другое. J>сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.
J>языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?
Должен вызываться метод класса А, со значением параметра шаблона, переданного при вызове.
Здравствуйте, Slick, Вы писали:
S>Здравствуйте, jazzer, Вы писали:
S>>>Сложность реализации поддержки компилятором? Или языковые коллизии?
J>>и то, и другое. J>>сложность реализации — в том, что неизвестно, сколько придется инстанцировать экземпляров каждого такого метода, и невозможность построить по-человечески таблицу виртуальных вызовов.
J>>языковые коллизии — представь, что ты в классе А определил такую функцию, а в классе В (наследнике А) объявил ее специализацию. Что должно зваться для объекта класса В, если к нему доступ осуществляется по ссылке на А?
S>Должен вызываться метод класса А, со значением параметра шаблона, переданного при вызове.
Ага, а параметр шаблона — это только при компиляции, а не при выполнении
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, 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 здесь?
}