Вы не можете определить SetData (вектор), так как std :: vector нужен тип, и, очевидно, вы не можете определить SetData (std :: vector ) в Base, если у вас нет определения для T.
Так что, если вам это действительно нужно и вы думаете, что это правильный путь, вам придется изучить диспетчеризацию типов (или взломать, используя void *).Boost использует диспетчеризацию типов в некоторых местах, иначе Google предоставляет примеры.
edit простой пример того, как это может выглядеть;на самом деле не диспетчеризация типа, но более простая
class Base
{
public:
template< class T >
bool SetData( const std::vector< T >& t )
{
return SetData( static_cast< const void* >( &t ), typeid( t ) );
}
protected:
virtual bool SetData( const void*, const std::type_info& ) = 0;
};
template< class T >
class Derived : public Base
{
protected:
bool SetData( const void* p, const std::type_info& info )
{
if( info == typeid( std::vector< T > ) )
{
const std::vector< T >& v = *static_cast< const std::vector< T >* >( p );
//ok same type, this should work
//do something with data here
return true;
}
else
{
//not good, different types
return false;
}
}
};