Да, вам нужно настроить свой класс на тип контейнера, который вы собираетесь использовать, например:
template < typename Queue >
class Test
{
Queue queue;
public:
void push( int i )
{
queue.push( i );
}
};
Если вы хотите базовый класс полностью полиморфного контейнера в стиле Java:
template < typename T >
class Queue
{
public:
virtual void push( const T& t ) = 0;
};
template < typename Q >
class QueueImpl : public Queue< typename Q::value_type >
{
public:
typedef typename Q::value_type value_type;
virtual void push( const value_type& t ) override
{
q.push( t );
}
private:
Q q;
};
std::unique_ptr< Queue< int > > queue = std::make_unique< QueueImpl< std::queue< int > > >();
queue->push( 1 );