C++:在模板快速排序函数中收到 "couldn' t 推断模板参数错误

标签 c++ templates compiler-errors quicksort template-function

我正在创建一个模板化的快速排序函数,它应该允许我使用迭代器对一个定制的双向链表类进行快速排序。我遇到了错误

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

根据我的理解,在研究了这个问题并阅读了其他人收到的解决方案之后,我不知何故直接在模板声明之外弄乱了我的列表类。根据编译器,我认为当我的主要快速排序函数调用递归函数时会发生这种情况?我不完全确定是什么导致了这个问题。

现在,这是我第一次尝试这样的模板函数,通过模板调用另一个类。如果这里面真的有很多错误,我不会感到惊讶,虽然它只向我展示了一个。如果有人还可以告诉我我在这次尝试中犯的任何其他错误,请也包括在内。

最佳答案

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

关于C++:在模板快速排序函数中收到 "couldn' t 推断模板参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30038952/

相关文章:

c++ - 使用 arg、*和* 作为数组实例化 C++ 模板化类

python - Django 缓存不工作 cached_queries() 没有参数(给定 1)

java - 需要基本 Java 程序的帮助

java - 努力在 Eclipse 中使用小于 target-sdk 的 min-sdk 编译 Android 应用程序

c++ - 仅在一个字符串 lex 处识别开始条件

C++模板基础程序,链接器找不到构造函数和析构函数

c++ - 建议编译器有选择地内联函数调用

ios - Apple LLVM 编译器 4.2 错误退出代码 1

c++ - 使用 OpenCV 复制指向的对象

c++ - C++中的双整数精度乘法