如何修复我的嵌入类/结构导致此错误的函数定义:无法推导出“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;
}

解决方法

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

要解决这个问题,您可以分解 freedata()list 类的声明和实现,例如:

Node

但实际上,在此示例中,#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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...