gpt4 book ai didi

c++ - 模板类定义中的模板方法与声明不匹配

转载 作者:行者123 更新时间:2023-12-01 14:40:18 25 4
gpt4 key购买 nike

我已经创建了模板类T的模板类LinkedList,并且在该类中,我想实现一个函数入队,该入队采用一般类型D的数据,并以数据D作为参数调用T构造函数。

这是我的类(class)的定义:

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);

忽略入队函数的实际内容,与以前的实现相比,我还没有更改。任何帮助,将不胜感激。谢谢。

最佳答案

您需要将函数体定义为:

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)。

关于c++ - 模板类定义中的模板方法与声明不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58880487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com