如何修复导致我的嵌入式类/结构出现此错误的函数定义:无法推断出"T"的模板参数?



我实现了一个名为Node的链表,它有一个名为freeData的函数,它将对给定的节点和其后的任何节点执行删除操作。

我想在我自己的自定义list类中实现它作为私有成员,但在Visual Studio 2019中提出了此错误:

C2672 'freeData':未找到匹配的重载函数

C2783 'void custom::freeData(list::Node*&):无法推断'T'的模板参数

我不知道如何改变我的freeData函数头接受Node*作为参数。我在这些函数中传递参数pHead:~list()clear()

在将freeData嵌入list类之前,之前的定义是void freeData(Node <T>* &pHead)

#include <iostream>
namespace custom
{
template <class T>
class list
{
public:
list() : numElements(0), pHead(NULL), pTail(NULL) { }
~list() { freeData(pHead); }
void clear() { freeData(pHead); numElements = 0; pHead = NULL; pTail = NULL; }
private:
struct Node;
Node* pHead;
Node* pTail;
int numElements;
};
template <class T>
struct list <T> :: Node
{
Node() : pNext(NULL), pPrev(NULL) {}
Node(const T& t) : data(t), pNext(NULL), pPrev(NULL) {}
T data;      // data of type T
Node* pNext; // pointer to next node
Node* pPrev; // pointer to previous node
};
template <class T>
void freeData(typename list <T>::Node*& pHead)
{
}
} // end of namespace
int main()
{
custom::list <int> l1;
l1.clear();
return 0;
}

freedata()是一个独立函数。与类方法不同,独立函数必须在使用之前声明。但是,在这种情况下,您不能向前声明freedata(),因为它的参数依赖于需要知道freedata()是什么的类型。第二十二条军规。

要解决这个问题,您可以将listNode类的声明和实现分开,例如:

#include <iostream>
namespace custom
{
template <class T>
class list
{
public:
list();
~list();
void clear();
private:
struct Node
{
Node();
Node(const T& t);
T data;      // data of type T
Node* pNext; // pointer to next node
Node* pPrev; // pointer to previous node
};
Node* pHead;
Node* pTail;
int numElements;
};
template <class T>
void freeData(typename list <T>::Node*& pHead)
{
...
}
template <class T>
list<T>::list() : numElements(0), pHead(NULL), pTail(NULL) { }
template <class T>
list<T>::~list() { freeData(pHead); }
template <class T>
void list<T>::clear() { freeData(pHead); numElements = 0; pHead = NULL; pTail = NULL; }
template <class T>
list<T>::Node::Node() : pNext(NULL), pPrev(NULL) {}
template <class T>
list<T>::Node::Node(const T& t) : data(t), pNext(NULL), pPrev(NULL) {}
} // end of namespace
int main()
{
custom::list <int> l1;
l1.clear();
return 0;
}

但实际上,在这个例子中没有理由让freedata()成为一个独立的函数。它应该是list类的成员,例如:

#include <iostream>
namespace custom
{
template <class T>
class list
{
public:
list() : numElements(0), pHead(NULL), pTail(NULL) { }
~list() { clear(); }
void clear() { freeData(pHead); numElements = 0; pHead = NULL; pTail = NULL; }
private:
struct Node
{
Node() : pNext(NULL), pPrev(NULL) {}
Node(const T& t) : data(t), pNext(NULL), pPrev(NULL) {}
T data;      // data of type T
Node* pNext; // pointer to next node
Node* pPrev; // pointer to previous node
};
Node* pHead;
Node* pTail;
int numElements;
static void freeData(Node*& pHead)
{
...
}
};
} // end of namespace
int main()
{
custom::list <int> l1;
l1.clear();
return 0;
}

相关内容

  • 没有找到相关文章

最新更新