C++:在模板快速排序功能中接收"couldn't deduce template parameter"错误



我正在创建一个模板的QuickSort函数,该功能应该使我可以使用迭代器来QuickSort QuickSort定制的双重链接列表类。我遇到了错误

In file included from main.cpp:21.0:
quicksort.h: In instantiation of 'void quicksort(listclass&) [with
listclass = inkist<int>]':
main.cpp:156:23: required from here
quicksort.h:36:33: error: no matching function for call to 
'_quicksort(inkist<int>::iterator&, inkist<int>::iterator&)'
   _quicksort(headfish, tailfish);
quicksort.h:36:33: note: candidate is:
quicksort.h:40:13: note: template<class listclass> void _quicksort (class
listclass::iterator&, class listclass::iterator&)
  inline void _quicksort(class listclass::iterator& headfish, class
listclass::iterator& tailfish)
quicksort.h:40:13: note: template argument deduction/substitution failed.
quicksort.h:36:33: note: couldn't deduce template parameter 'listclass'
   _quicksort(headfish, tailfish);

这是我的代码:

#ifndef _quicksort_h_included_
#define _quicksort_h_included_

#include <iterator>
template <class listclass>
inline void swap(class listclass::iterator& onefish, class listclass::iterator& twofish)
{
   class listclass::const_iterator tempfish;
   *tempfish=*onefish
   *onefish=*twofish;
   *twofish=*tempfish;
};
template <class listclass>
inline void quicksort (listclass& redlist)
{
   class listclass::iterator headfish;
   headfish=redlist.begin();
   class listclass::iterator tailfish;
   tailfish=redlist.end();
   _quicksort(headfish, tailfish);
};
template <class listclass>
inline void _quicksort(class listclass::iterator& headfish, class listclass::iterator& tailfish)
{
   if (headfish.P!=tailfish.P && headfish.P!=tailfish.P->next)
   {
      class listclass::iterator itrfish = partition(headfish, tailfish);
      class listclass::iterator lowfish(itrfish.P->prev);
      class listclass::iterator highfish(itrfish.P->next);
      _quicksort(headfish, lowfish);
      _quicksort(highfish, tailfish);
   }
};
template <class listclass>
inline class listclass::iterator partition(class listclass::iterator& headfish, class listclass::iterator& tailfish)
{
   class listclass::iterator datafish;
   *datafish=*headfish;
   class listclass::iterator pvtfish(headfish.P->prev);
   class listclass::iterator sortfish;
   for (sortfish.P=headfish.P; sortfish.P!=tailfish.P; sortfish.P=sortfish.P->next)
   {
      if(*sortfish<=*datafish)
      {
         if (sortfish.P==0)
            sortfish.P=headfish.P;
         else
            sortfish.P++;
         swap(&sortfish, &pvtfish);
      }
   }
   if (sortfish.P==0)
      sortfish.P=headfish.P;
   else
      sortfish.P++;
   swap(&sortfish, &tailfish);
   return sortfish;
};

#endif

根据我的理解,在研究了这个问题并通过其他人收到的解决方案阅读后,我以某种方式直接与模板声明之外的ListClass混在一起。根据编译器的说法,我认为当我的主要QuickSort功能调用递归功能时,它会发生?我不完全确定我所做的已经引起了这个问题的是什么。

现在,这是我第一次使用这样的模板函数实验,并通过模板调用另一个类。如果实际上有很多错误,我不会感到惊讶,而只是向我展示了一个错误。如果有人也可以告诉我我对此尝试犯的任何其他错误,请还包括这些错误。

template <class listclass>
inline void _quicksort(class listclass::iterator& headfish, class listclass::iterator& tailfish);

此处listclass在"非推论上下文"中使用。它不能以任何方式从函数参数中推导。

因此,一种解决方案是指定它,而不是试图使编译器推断出来:

template <class listclass>
inline void quicksort (listclass& redlist)
{
   // ...
   _quicksort<listclass>(headfish, tailfish);
};

或者,您可以这样更改_quicksort

template <class FwdIter>
inline void _quicksort(FwdIter& headfish, FwdIter& tailfish);

可以推导FwdIter

相关内容

最新更新