Использование значения value_type шаблонного параметра

Как предполагается использовать значение value_type контейнера std?
Я попытался использовать его так:

#include  using namespace std; template  class TSContainer { private: T container; public: void push(T::value_type& item) { container.push_back(item); } T::value_type pop() { T::value_type item = container.pop_front(); return item; } }; int main() { int i = 1; TSContainer<vector > tsc; tsc.push(i); int v = tsc.pop(); } 

Но это приводит к:

 prog.cpp:10: error: 'T::value_type' is not a type prog.cpp:14: error: type 'T' is not derived from type 'TSContainer' prog.cpp:14: error: expected ';' before 'pop' prog.cpp:19: error: expected `;' before '}' token prog.cpp: In function 'int main()': prog.cpp:25: error: 'class TSContainer<std::vector<int, std::allocator > >' has no member named 'pop' prog.cpp:25: warning: unused variable 'v' 

Я думал, что это то, для чего: value_type?

Вы должны использовать typename :

 typename T::value_type pop() 

и так далее.

Причина в том, что компилятор не может знать, является ли T :: value_type типом переменной-члена (никто не мешает вам определить тип struct X { int value_type; }; и передать это шаблону). Однако без этой функции код не может быть проанализирован (поскольку значение конструкций изменяется в зависимости от того, обозначает ли какой-то идентификатор тип или переменную, например T * p может быть умножением или объявлением указателя). Поэтому правило состоит в том, что все, что может быть как типом, так и переменной, и явно не помечено как тип, префикс его с помощью typename , считается переменной.

Используйте ключевое слово typename чтобы указать, что это действительно тип.

 void push(typename T::value_type& item) typename T::value_type pop()