首页 > 解决方案 > 模板类定义中的模板方法与声明不匹配

问题描述

我已经制作了模板类 T 的模板类 LinkedList ,在这个类中,我想实现一个函数入队,它接受一般类型 D 的数据并以数据 D 作为参数调用 T 构造函数。

这是我的班级的定义:

template<class T>

struct Node {
    struct Node *_nextNode;
    struct Node *_prevNode;
    T *_value;
    int _location;
};

template<class T>
class LinkedList    {

private:
    Node<T> *_firstNode;
    Node<T> *_lastNode;
    int _size;

public:
    LinkedList<T>();
    LinkedList<T>(const int size);
    ~LinkedList<T>();

    template<typename D>
    bool enqueue(D &newData);
    bool dequeue();
    T* find(const int location);

};

这就是我声明函数入队的地方:

template<class T, typename D>
bool LinkedList<T>::enqueue(D &newData) {
    Node<T> *newNode = new Node<T>;
    newNode->_value = new T(newData);
    newNode->_location = _lastNode->_location + 1;
    _lastNode->_nextNode = newNode;
    newNode->_prevNode = _lastNode;
    _lastNode = newNode;
    _lastNode->_nextNode = NULL;
    _size++;

    return true;
}

尝试编译时,我得到:

LinkedList.cpp:76:6: error: prototype for ‘bool LinkedList<T>::enqueue(D&)’ does not match any in class ‘LinkedList<T>’
 bool LinkedList<T>::enqueue(D &newData) {
      ^~~~~~~~~~~~~
LinkedList.cpp:29:7: error: candidate is: template<class T> template<class D> bool LinkedList<T>::enqueue(D&)
  bool enqueue(D &newData);

忽略入队函数的实际内容,我还没有从我之前的实现中改变它。任何帮助,将不胜感激。谢谢。

标签: c++templates

解决方案


您需要将函数体定义为:

template <typename T>
template <typename D>
bool LinkedList<T>::enqueue (D& newData) {
  // ...
}

此外,const D&可能更清洁。使用完美转发会更好,以允许传递任何类型的引用类型:

template <typename T>
template <typename D>
bool LinkedList<T>::enqueue (D&& newData) {
  // ...
  newNode->_value = new T (std::forward<D>(newData));
}

这也可以用于构造函数的任意数量的参数:

template <typename T>
template <typename... D>
bool LinkedList<T>::enqueue (D&&... newData) {
  // ...
  newNode->_value = new T (std::forward<D>(newData)...);
}

此外,您的代码不是异常安全的。如果T构造函数抛出异常,newNode则永远不会释放实例,从而导致内存泄漏。

此外,不要使用NULL,但nullptr尽可能使用(即如果您可以使用 C++11)。


推荐阅读