Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当通过C+;中的指针绘图时,继承的类与其父类不兼容+;_C++_Inheritance - Fatal编程技术网

C++ 当通过C+;中的指针绘图时,继承的类与其父类不兼容+;

C++ 当通过C+;中的指针绘图时,继承的类与其父类不兼容+;,c++,inheritance,C++,Inheritance,考虑以下代码:从技术上讲,集合是一个向量,另外还有sort方法 template<class T> class collection { public: std::vector<T> vec; void sort(sortType<T>* U, bool compare(T, T)) { U->doSort(vec, compare) ; } } 模板 类集合 { 公众: std::vec; 无效排序(排序类型*U,布尔

考虑以下代码:从技术上讲,集合是一个向量,另外还有sort方法

template<class T>
class collection
{
public:
  std::vector<T> vec;
  void sort(sortType<T>* U, bool compare(T, T))
  {
      U->doSort(vec, compare) ;
  } 
} 
模板
类集合
{
公众:
std::vec;
无效排序(排序类型*U,布尔比较(T,T))
{
U->doSort(vec,compare);
} 
} 
这是sortType类

template<class T>
class sortType
{
 protected:
   virtual void doSort(std::vector<T>&,  bool compare(T, T)){};
} 
模板
类排序类型
{
受保护的:
虚空doSort(std::vector&,bool-compare(T,T)){};
} 
下面的代码是我想要使用的一些不同的排序方法

template<class T>
class insertionsort : public sortType
{
 public: 
   void doSort(std::vector<T>&, bool compare(T, T))
    {
      //code of insertion sort
    } 
} 
template<class T>
class quicksort : public sortType
{
 public: 
   void doSort(std::vector<T>&, bool compare(T, T))
    {
      //code of quicksort
    } 
} 
模板
类insertionsort:public sortType
{
公众:
void doSort(标准::向量和布尔比较(T,T))
{
//插入排序代码
} 
} 
模板
类快速排序:公共排序类型
{
公众:
void doSort(标准::向量和布尔比较(T,T))
{
//快速排序代码
} 
} 
比较是一个如下所示的函数:

template <class T>
bool greater( T l, T r) 
{
    if (l<r) return true;
    return false;
} 
insertionsort<int> U = insertionsort<int>();
collection<int> *Obj = new collection<int>();
Obj->sort(U, greater) ;    //error here!
模板
布尔更大(tl,tr)
{
if(lsort(U,更大);//此处出错!
不幸的是,visual studio宣布我无法将insertionsort类传递给sortType类。我如何修复它并使用与前面类似的内容。感谢您的帮助

我已经编写了一个小代码来测试同样的问题

template<class T>
T doSomeThing(int a, int b, pheptoan<T>* U)
{
    return U->dopheptoan<int>(a, b);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 6; int b = 7;
    phepcong<int>* U = new phepcong<int>();
    doSomeThing<int>(a, b, U);     //error here
    return 0;
}
模板
剂量测定法(int a、int b、pheptoan*U)
{
返回U->dopheptoan(a,b);
}
int _tmain(int argc,_TCHAR*argv[]
{
INTA=6;INTB=7;
phepcong*U=新的phepcong();
doSomeThing(a,b,U);//此处出错
返回0;
}

我假设您在
集合
之前声明了
排序类型

派生类应声明为

模板类插入排序:公共排序类型

模板类快速排序:公共排序类型


并且
collection::sort
使用指向
sortType
的指针,因此最后一行应该是'Obj->sort(&U,更大)“

我已经为测试这个问题编写了一个小代码。问题不在于继承。而是模板的问题。当我去掉模板并将其与int等普通类型一起使用时,不会发生任何事情。但是当我更改代码并与模板一起使用时,编译器会出现错误,因为sortType现在是一个模板类根据它,您需要说sortType,而不仅仅是sortType。您是从模板基类继承的。因此模板部分也是类类型的一部分。这就是为什么您需要在其名称中包含模板参数。我相信它应该是Obj->sort(&U,更大)。我也不确定您定义比较参数的方式是否有效语法。应该是bool(*compare)(T,T)afaikWhy使用按接口排序和按指针比较函数?比较可能也有状态。@Jarod42我不确定你的意思。我同意我在使用按接口排序时不专业,但使用按指针比较函数。我认为我只需要比较大小,所以我这样做了it@user2717954一开始,我也和你一样担心但实际上是这样吗worked@TrầnNgọcDũng:举例来说,您可能希望根据存储在其他数组()中的值对
索引进行排序。