c++ - 在模板类之外定义方法

标签 c++

<分区>

我正在编写一个简单的链表并且一切正常,但是在类外定义方法时我遇到了一些我无法理解的问题。如果我在类内部定义该方法,它会完美运行,当我声明该方法并尝试在类外部定义它时,我会遇到编译错误...

下面是正常运行时的代码:

#ifndef LINKEDLIST__H_
#define LINKEDLIST__H_
#pragma warning (disable: 4290)
#include "Item.h"
template<class T> class LinkedList
{
    Item<T>* head;
    Item<T>* tail;
public:
    LinkedList(): head(new Item<T>()), tail(new Item<T>())
    {
        head->setNext(tail);
        tail->setPrev(head);
    }
    ~LinkedList() { delete head; } // how does that work?

    class Iterator // Nested class.
    {
        Item<T>* p;
        friend class LinkedList<T>;
    public:
        Iterator(Item<T>* pt = 0) : p(pt) {}
        int operator!=(Iterator itr) const // Operator !=
        {
            return (p != itr.p);
        }
        Iterator& operator++(int) throw(char*) // Operator ++ (postfix)
        {
            if (p == NULL)
                throw "null pointer in list::iterator";
            p = p->getNext();
            return *this;
        }
        Iterator& operator--(int) throw (char*) // Operator -- (postfix)
        {
            if (p == NULL)
                throw "null pointer in list::iterator";
            p = p->getPrev();
            return *this;
        }
        T& operator*() throw (char*) // Operator *
        {
            if (p == NULL || p->getData() == NULL)
                throw "null pointer in list::iterator";
            return *(p->getData());
        }
    }; // End of class Iterator scope.
    Iterator begin() { return head->getNext(); }
    Iterator end() { return tail; }
    Iterator insert(Iterator itr, const T& data)
    {
        // create a copy of data
        Item<T>* pNewItem = new Item<T>(new T(data));
        // connect
        pNewItem->setNext(itr.p);
        pNewItem->setPrev(itr.p->getPrev());
        itr.p->getPrev()->setNext(pNewItem);
        itr.p->setPrev(pNewItem);
        return pNewItem;
    }
    Iterator erase(Iterator itr);
}; // End of class LinkedList scope.
#endif // !LINKEDLIST__H_

当我尝试在类外部实现插入方法时:(顺便说一下,这是 VS2015 自动执行此操作的方式,并且由于静态绑定(bind),它是在头文件中定义的) 此代码不起作用,它会导致编译错误:

template<class T>
inline Iterator LinkedList<T>::insert(Iterator itr, const T & data)
{
    // create a copy of data
    Item<T>* pNewItem = new Item<T>(new T(data));
    // connect
    pNewItem->setNext(itr.p);
    pNewItem->setPrev(itr.p->getPrev());
    itr.p->getPrev()->setNext(pNewItem);
    itr.p->setPrev(pNewItem);
    return pNewItem;
}

在类外定义方法:(编译错误) enter image description here

最佳答案

什么是 Iterator ?你需要告诉编译器 IteratorLinkedList<T> 的内部类依赖范围。

wandbox example

template <typename T> 
struct LinkedList
{
    class Iterator
    {    
    }; 

    Iterator insert(Iterator, const T&);
};

template <typename T>
typename LinkedList<T>::Iterator LinkedList<T>::insert(Iterator, const T&) 
{
    // ...
}

关于c++ - 在模板类之外定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892513/

相关文章:

c++ - T const & 在函数的返回类型中意味着什么?

c++ - 将常量 unique_ptr 设为常量 vector

c++ - 是否可以使模板函数成为模板特化类的友元?

c++ - 容器比较器使用虚拟实例

c++ - 将迭代器返回到 STL 容器中的元素

c++ - 如何很好地输出分隔字符串列表?

C++ 模式 : 1x base class + Nx derived classes BUT with a _last resort_ derived class

c++ - Python 列表和 c/c++ 数组

c++ - 用于类型实例化的 SFINAE

c++ - Qt for wasm : error: use of undeclared identifier 'QThreadPool'