使用模板化参数的value_type

Jon*_*nks 15 c++ templates std

如何使用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();
}
Run Code Online (Sandbox Code Playgroud)

但这会导致:

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’
Run Code Online (Sandbox Code Playgroud)

我认为这是:: value_type的用途?

cel*_*chk 23

你必须使用typename:

typename T::value_type pop()
Run Code Online (Sandbox Code Playgroud)

等等.

原因是编译器无法知道T :: value_type是否是成员变量的类型(没有人阻碍您定义类型struct X { int value_type; };并将其传递给模板).但是,如果没有该函数,则无法解析代码(因为构造的含义根据某个标识符是指定类型还是变量而改变,例如T * p可以是乘法或指针声明).因此,规则是所有可能是类型或变量且未通过为其加前缀而明确标记为类型的内容typename被视为变量.


Mar*_*som 7

使用typename关键字表示它确实是一种类型.

void push(typename T::value_type& item)

typename T::value_type pop()
Run Code Online (Sandbox Code Playgroud)