c++ - 模板类定义中的模板方法与声明不匹配
问题描述
我已经制作了模板类 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);
忽略入队函数的实际内容,我还没有从我之前的实现中改变它。任何帮助,将不胜感激。谢谢。
解决方案
您需要将函数体定义为:
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# - 如何将本地数据库与文本框链接
- flask - 我该如何处理这个错误'UnboundLocalError:分配前引用的局部变量'用户''
- javascript - 使用浅包装器模拟点击事件时,这是未定义的
- node.js - 使用 Promise 的同步数据库查询
- python - 为什么此列表理解仅“有时”有效?
- c# - 多域网站,发布时,访问2个工作,1个没有,错误500失败
- karate - Retry untill 不适用于空手道框架中的 xpath 条件
- angular - 如何过滤带有重音符号/变音符号的 MatTable?
- javascript - 是否可以将 Electron 应用程序和数据文件嵌入到单个可执行文件中?
- python - web.whatsapp 没有传递机器人的消息