如何使用std容器的value_type?
我试着像这样使用它:
#include <vector>
using namespace std;
template <typename T>
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<int> > 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<T>’
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<int> > >’ has no member named ‘pop’
prog.cpp:25: warning: unused variable ‘v’
我认为这是:: value_type的用途?
答案 0 :(得分:23)
您必须使用typename
:
typename T::value_type pop()
等等。
原因是编译器无法知道T :: value_type是否是成员变量的类型(没有人阻碍您定义类型struct X { int value_type; };
并将其传递给模板)。但是,如果没有该函数,则无法解析代码(因为构造的含义根据某个标识符是指定类型还是变量而改变,例如。T * p
可以是乘法或指针声明)。因此,规则是所有可能是类型或变量且未通过在typename
前面加上明确标记为类型的内容被视为变量。
答案 1 :(得分:7)
使用typename
关键字表示它确实是一种类型。
void push(typename T::value_type& item)
typename T::value_type pop()
答案 2 :(得分:0)
如果可以帮助任何人,这里是上面接受的答案的完整实现。
#include <iostream>
#include <list>
template <typename T>
class C1 {
private:
T container;
typedef typename T::value_type CT;
public:
void push(CT& item) {
container.push_back(item);
}
CT pop (void) {
CT item = container.front();
container.pop_front();
return item;
}
};
int main() {
int i = 1;
C1<std::list<int> > c;
c.push(i);
std::cout << c.pop() << std::endl;
}