Код ниже дает ошибку:
error: type ‘std::list<T,std::allocator<_Tp1> >’ is not derived from type ‘Foo<T>’
error: expected ‘;’ before ‘iter’
#include <list>
template <class T> class Foo
{
public:
std::list<T>::iterator iter;
private:
std::list<T> elements;
};
Почему и что это должно быть должно быть корректным?
Вам нужен typename std::list
. Это происходит потому, что list
зависит от параметра шаблона, поэтому компилятор не может знать, как именно будет называться iterator
внутри него (ну, технически он мог бы знать, но стандарт C++ так не работает). Ключевое слово typename
говорит компилятору, что то, что следует за ним, является именем типа.
Вам нужен typename
template <class T> class Foo {
public:
typename std::list<T>::iterator iter;
private:
std::list<T> elements;
};