Самая простая причина понять, почему это незаконно, - рассмотреть vtable.Конечно, это только одна общая реализация, и другие разрешены.Но все функции virtual
в C ++ разработаны таким образом, что их можно реализовать с помощью vtable.
Теперь, сколько записей в vtable
из CFoo<int>
?Есть ли запись для doSomething<float>
?И doSomething<float*>
?И doSomething<float**>
?Подобные шаблоны позволяют генерировать бесконечный набор функций.Обычно это не проблема, так как вы используете только конечное подмножество, но для виртуальных функций это подмножество неизвестно, и поэтому виртуальная таблица должна быть бесконечной.
Теперь, возможно, вы действительно хотели толькоодиночная запись в vtable.В этом случае вы бы написали это следующим образом:
template < class FOO_TYPE, class BAR_TYPE>
class CFoo{
public:
...
virtual void doSomething( const CBar<BAR_TYPE> &); // now OK.
...
virtual ~CFoo();
protected:
MyClass < FOO_TYPE > * m_pClass;
};
Это означает, что в vtable для CFoo<int, float>
будет одна запись для doSomething(float const&)
.