[英]Custom List with iterator, error when trying to make pointer to nested node class
我正在尝试使用迭代器实现一个简单的列表以供练习,但是我遇到了一个我不完全理解的编译错误,我无法修复它。 当我尝试在我的迭代器 class 中将指针指向节点时,我收到如下编译错误:
使用 class 模板需要模板参数列表
这是我产生编译错误的头文件:
#ifndef _MY_LIST_H
#define _MY_LIST_H
#include <memory>
template<class T>
class MyListItr;
template<typename T>
class MyList {
private:
int _size;
friend class MyListItr<T>;
public:
class Node {
private:
T value;
public:
std::unique_ptr<MyList::Node> next{ nullptr };
Node() = delete;
Node(T& value, MyList::Node* next) :value(value), next(next) {};
T getVal()const { return value; };
void setVal(T value) { this->value = value; };
~Node() {};
};
std::unique_ptr<MyList::Node> head;
MyList(const MyList<T>&) = delete;
MyList& operator=(const MyList<T>) = delete;
MyList() :_size(0), head(nullptr) {};
int size()const { return _size; };
void push_front(T);
T pop_front();
T front()const;
void remove(T);
MyListItr<T> begin() {return MyListItr(this->head); };
MyListItr<T> end();
typedef MyListItr<T> iterator;
typedef MyList<T>::Node value_type;
typedef MyList<T>::Node* pointer;
typedef MyList<T>::Node difference_type;
typedef MyList<T>::Node& reference;
};
template<typename T>
class MyListItr {
MyList::Node* data;
public:
MyListItr(MyList::Node*data) : data(data) {}
bool operator!=(MyListItr<T>const&) const;
MyListItr<T> operator++();
T operator*();
};
#endif
对于在哪里寻找任何线索的任何帮助或指导,我将不胜感激。
您需要 class MyListItr
template<typename T>
class MyListItr {
typename MyList<T>::Node* data;
public:
MyListItr(typename MyList<T>::Node*data):data(data) {}
// ...
};
请注意,您需要使用typename
关键字来告诉编译器您使用的数据是类型,而不是变量。
模板参数不能自动推导时必须指定模板参数(C++17引入了class模板中的模板参数自动推导)。
您有几行没有指定模板参数:
MyListItr<T> begin() { return MyListItr(this->head); /* Here you forget semicolon */};
MyList::Node* data;
MyListItr(MyList::Node*data):data(data) {}
你像下面这样重写它们:
MyListItr<T> begin() { return MyListItr<T>(this->head);};
typename MyList<T>::Node* data;
MyListItr(typename MyList<T>::Node*data):data(data) {}
在第一行编译器不能通过返回类型推断MyListItr
的模板参数(我认为,你认为,如果你在返回类型中指定了模板参数,编译器可以“记住”它),因为例如MyListItr
s with不同的模板参数可以相互转换...
在其他行中,编译器对MyList
一无所知,因为意识到您的列表及其迭代器应该具有相同的模板参数并不是很聪明。 它更多地是关于用户定义的语义。
您必须在第二行和第三行编写typename
,因为此类型取决于模板参数。 这是一些解释: https://en.cppreference.com/w/cpp/language/dependent_name
此外,您最好重命名以下行中的参数,因为它可能与模板参数名称冲突:
bool operator!=(MyListItr<T> const& T_)const;
此外,您可以尝试在列表的 class 中声明迭代器,它会自动在其中绑定类型。 在这种情况下,您还可以从用户代码中隐藏Node
并在私有部分中声明它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.