Хорошая ошибка компилятора. Для этого типа проверок я всегда возвращаюсь к компилятору Comeau перед тем, как вернуться к стандарту и проверить.
Comeau C / C ++ 4.3.10.1 (6 октября 2008 г., 11:28:09) для ONLINE_EVALUATION_BETA2 Авторские права 1988-2008 Comeau Computing. Все права защищены. РЕЖИМ: строгие ошибки C ++ C ++ 0x_extensions
"ComeauTest.c", строка 3: ошибка: "virtual" не допускается в шаблоне объявления шаблона функции virtual void f (); ^
«ComeauTest.c», строка 10: ошибка: «virtual» не допускается в шаблоне объявления шаблона функции virtual void f (); ^
Теперь, когда это было опубликовано другим пользователем, факт в том, что стандарт не позволяет вам определять виртуальные шаблонные методы. Причина в том, что для всех виртуальных методов запись должна быть зарезервирована в vtable. Проблема в том, что методы шаблона будут определены только после того, как они будут созданы (использованы). Это означает, что vtable будет иметь разное количество элементов в каждой единице компиляции, в зависимости от того, сколько разных вызовов f () с разными типами происходит. Тогда бы ад поднялся ...
Если вам нужна шаблонная функция для одного из ее аргументов и одна конкретная версия является виртуальной (обратите внимание на часть аргумента), вы можете сделать это:
class Base
{
public:
template <typename T> void f( T a ) {}
virtual void f( int a ) { std::cout << "base" << std::endl; }
};
class Derived : public Base
{
public:
virtual void f( int a ) { std::cout << "derived" << std::endl; }
};
int main()
{
Derived d;
Base& b = d;
b.f( 5 ); // The compiler will prefer the non-templated method and print "derived"
}
Если вы хотите, чтобы это было обобщено для любого типа, то вам не повезло. Рассмотрим другой тип делегирования вместо полиморфизма (решением может быть агрегация + делегирование). Дополнительная информация о проблеме поможет в поиске решения.
person
David Rodríguez - dribeas
schedule
16.04.2009