Передача стандартного контейнера в шаблонный класс - PullRequest
2 голосов
/ 10 ноября 2011

Почему это не работает?

template <typename T, typename U>  
class TSContainer {  
private:  
   U<T> container;  
};

называется:

TSContainer<int, std::vector> ts;

Я думаю, что решение может быть:

template <typename T, template <typename> typename C>  
class TSContainer  
{  
        C<T> container;  
};

, но это не тактоже не работает.

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Это то, что вам нужно:

#include <vector>
template <typename T, template<typename, typename> class C>  
class TSContainer  
{  
    C<T, std::allocator<T> > container;  
};

int main() {
  TSContainer<int, std::vector> a;
}

Обратите внимание, что std::vector принимает два параметра шаблона, второй по умолчанию равен std::allocator. В качестве альтернативы вы можете написать:

#include <vector>
template <typename T, template<typename, typename = std::allocator<T> > class C>  
class TSContainer  
{  
        C<T> container;  
};

int main() {
  TSContainer<int, std::vector> a;
}

Оба из них навязывают вам выбор распределителя. Если вы хотите контролировать, какой распределитель используется вашим вектором (то есть то, что используется в качестве второго параметра шаблона для C), вы также можете использовать это:

#include <vector>
template <typename T, template<typename, typename> class C, typename A = std::allocator<T> >  
class TSContainer  
{  
        C<T, A> container;  
};

int main() {
  TSContainer<int, std::vector> a;
}

Это наиболее гибкое решение.

1 голос
/ 10 ноября 2011

Не было бы намного проще просто сделать что-то вроде:

#include <vector>
template <typename C>  
class TSContainer  
{  
    C container;  
};

int main() {
  TSContainer<std::vector<int> > a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...