C++ 使用模板参数';s值_型

C++ 使用模板参数';s值_型,c++,templates,std,C++,Templates,Std,如何使用std容器的值类型? 我试着这样使用它: #include <vector> using namespace std; template <typename T> class TSContainer { private: T container; public: void push(T::value_type& item) { container.push_back(ite

如何使用std容器的值类型?
我试着这样使用它:

#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();
}
#包括
使用名称空间std;
模板
类容器{
私人:
T形容器;
公众:
无效推送(T::值\类型和项目)
{
容器。推回(项目);
}
T::value_type pop()
{
T::value_type item=container.pop_front();
退货项目;
}
};
int main()
{
int i=1;
TSContainer 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’
prog.cpp:10:错误:“T::value\u type”不是类型
程序cpp:14:错误:类型“T”不是从类型“TSContainer”派生的
程序cpp:14:错误:应为“;”在“流行音乐”之前
程序cpp:19:错误:应为`;'在“}”标记之前
prog.cpp:在函数“int main()”中:
prog.cpp:25:错误:“class TSContainer”没有名为“pop”的成员
程序cpp:25:警告:未使用的变量“v”

我以为这就是::value\u type的用途?

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

void push(typename T::value_type& item)

typename T::value_type pop()

您必须使用
typename

typename T::value_type pop()
等等


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

以下是上述公认答案的完整实现,以防对任何人有所帮助

#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;
}
#包括
#包括
模板
C1类{
私人:
T形容器;
typedef typename T::value_type CT;
公众:
无效推送(CT和项目){
容器。推回(项目);
}
CT pop(无效){
CT项目=container.front();
container.pop_front();
退货项目;
}
};
int main(){
int i=1;
C1 c;
c、 推(i);

std::在编写可重用库代码时(甚至永远)不可能重复。建议不要使用名称空间std;
。请拼出正确的名称空间。@KerrekSB:这是一个示例。@Jonathan:有关进一步的解释,请参阅此常见问题解答: