C++ 错误C2440:&x27&书信电报;功能样式转换>';:无法从';LinkedList<;int>;::节点*';至';LinkedListerator<;常数T>';

C++ 错误C2440:&x27&书信电报;功能样式转换>';:无法从';LinkedList<;int>;::节点*';至';LinkedListerator<;常数T>';,c++,linked-list,iterator,C++,Linked List,Iterator,我正在尝试实现链表迭代器,并得到编译错误。在我的测试代码中,T是int。当我尝试调用迭代器构造函数时,它没有看到节点作为参数传递的选项 代码如下: template <typename T> class LinkedListIterator { typedef typename LinkedList<T>::Node Node; ... LinkedListIterator(Node* p) : p(p) {} LinkedListIte

我正在尝试实现链表迭代器,并得到编译错误。在我的测试代码中,T是int。当我尝试调用迭代器构造函数时,它没有看到节点作为参数传递的选项

代码如下:

template <typename T>
class LinkedListIterator
{
    typedef typename LinkedList<T>::Node Node;
    ...

    LinkedListIterator(Node* p) : p(p) {}
    LinkedListIterator(const LinkedListIterator& other) : p(other.p) {}
    LinkedListIterator& operator=(LinkedListIterator other) { std::swap(p, other.p); return *this; }
    ...
};

template <typename T>
class LinkedList
{
    struct Node ...

    friend class LinkedListIterator<T>;
    friend class LinkedListIterator<const T>;

    ...

    typedef LinkedListIterator<T> iterator;
    typedef LinkedListIterator<const T> const_iterator;

    ...

    const_iterator begin() const //where error happens
    {
        return const_iterator(head->next);
    }
...

};
模板
类链接标识符
{
typedef typename LinkedList::Node节点;
...
链接标识符(节点*p):p(p){}
LinkedListIterator(const LinkedListIterator&other):p(other.p){}
LinkedListIterator&operator=(LinkedListIterator其他){std::swap(p,other.p);返回*this;}
...
};
模板
类链接列表
{
结构节点。。。
好友类链接标识符;
好友类链接标识符;
...
typedef LinkedList迭代器;
typedef LinkedListIterator常量迭代器;
...
常量迭代器begin()常量//发生错误的位置
{
返回常量迭代器(head->next);
}
...
};

在代码中,您试图构造
LinkedList::const\u迭代器,即
LinkedListIterator
LinkedListIterator
有两个允许转换的构造函数:一个是我将忽略的副本构造函数,另一个来自
LinkedListIterator::Node*
LinkedListIterator::Node*
LinkedList::Node*
。但是你没有一个
LinkedList::Node*
,你有一个
LinkedList::Node*
。这是一种完全不同的类型,因此编译器拒绝转换是正确的


如果您想在
LinkedList
LinkedList
之间添加任何类型的继承关系(我不知道这是否有意义),您可以添加部分专业化,并让
LinkedList::Node
LinkedList::Node
相关,但不需要您做任何特殊工作,编译器错误是您将得到的唯一结果。

什么是
head->next
@KerrekSB这是
LinkedList::Node*
。它不在代码中,但作为转换源类型出现在错误消息中。为什么不在上面包含
next
的定义?让所有相关的代码都可用总是很有帮助的,所以我们不必猜测。很抱歉,我一直收到“太多代码”错误,在我整理所有内容之前无法发布。。。节点基本上是一个带有下一个指针和T数据的结构。哦,天哪,你说得对,C++让我的大脑想爆炸!