C++ 在模板类中定义迭代器时STL编译错误

C++ 在模板类中定义迭代器时STL编译错误,c++,stl,C++,Stl,下面的代码给出了错误: 错误:类型“std::list”不是从类型“Foo”派生的。 错误:应为“;”在“iter”之前 #包括 模板类Foo { 公众: 标准::列表::迭代器iter; 私人: std::列表元素; }; 为什么以及这应该是什么?您需要typename std::list::iterator。这是因为列表取决于模板参数,因此编译器不能知道它的名称>代码>迭代器< /> >(在技术上它可以知道,但是C++标准不这样工作)。关键字typename告诉编译器后面是一个类型的名称。

下面的代码给出了错误:

错误:类型“std::list”不是从类型“Foo”派生的。

错误:应为“;”在“iter”之前

#包括
模板类Foo
{
公众:
标准::列表::迭代器iter;
私人:
std::列表元素;
};

为什么以及这应该是什么?

您需要
typename std::list::iterator
。这是因为<代码>列表取决于模板参数,因此编译器不能知道它的名称>代码>迭代器< /> >(在技术上它可以知道,但是C++标准不这样工作)。关键字
typename
告诉编译器后面是一个类型的名称。

您需要一个typename

template <class T> class Foo  {
    public:
        typename std::list<T>::iterator iter;

    private:
        std::list<T> elements;
};
模板类Foo{
公众:
typename std::list::iterator iter;
私人:
std::列表元素;
};

我还是不明白为什么会这样。例如,为什么我们不需要使用“typename std::list elements”?@Agnel:因为这样我们就不会试图访问模板类中定义的名称。
template <class T> class Foo  {
    public:
        typename std::list<T>::iterator iter;

    private:
        std::list<T> elements;
};