лол а как ты себе это представляешь?)
template - статический полиморфизм, virtual - динамический
И как я должен в наследнике их перегружать? Поставлю override, а такая функция не инстанцирована, что делать?
struct Foo { template<class T> virtual void foo(const T&) { std::cout << "Not implemented" << std::endl; } }; struct Bar : Foo { virtual void foo(const int&) { std::cout << "int" << std::endl; } virtual void foo(const float&) { std::cout << "float" << std::endl; } }; int main() { Bar bar; bar.foo(1); // int bar.foo(1.0f); // float bar.foo(1.0); // Not implemented return 0; } Как-то так
при инстанцировании он не сможет понять на этапе компиляции, к какому классу вызов нужно будет отнести. Другими словами, шаблон подставить сможет к базовому классу, но понять, что он относится на самом деле к дочернему - не сможет
Он же сможет определить это в рантайме через vtable
Member function templates cannot be declared virtual. This constraint is imposed because the usual implementation of the virtual function call mechanism uses a fixed-size table with one entry per virtual function. However, the number of instantiations of a member function template is not fixed until the entire program has been translated. Hence, supporting virtual member function templates would require support for a whole new kind of mechanism in C++ compilers and linkers. In contrast, the ordinary members of class templates can be virtual because their number is fixed when a class is instantiated
Нашли проблему конечно.... Ладно, спасибо
если это насмешка над создателями языка, то советую пойти поучить матчасть перед тем, как делать такие глупые высказывания
Вымысле это супер огромная проблема
вот ты написал метод шаблонный и сделал его виртуальный, что должен сделать компилятор? ему нужно сделать таблицу. вопрос сколько функций в таблице?
Столько сколько инстанциаций шаблона
И сколько их?)
То есть проблема в том, что компилятор не может посчитать общее количество, потому что они в разных translation unit?
в том числе поэтому
Обсуждают сегодня