我正在尝试创建一个从不同类型的排序静态继承的sortmethods类。意味着根据排序选择的类型,sortmethods继承其成员。我在使用模板方面真的很新。而且我已经被困了好几天了。我将不胜感激。
我曾尝试使用可变参数模板,模板模板,但仍无法修复。
template<typename SortMethod>
class Sorter : private SortMethod{
public:
template<typename container, typename ... Types>
void operator()(container cnt, Types ... args){
this-> sort(cnt, args...);
}
};
int main(){
vector <int> v{10,1,20};
Sorter<QuickSort> S1;
S1(v,v.begin(),v.end());
return 0;
}
class QuickSort{
public:
template<typename C, typename forward>
void sort(C cnt, forward primero, forward ultimo) {
forward i, j, central;
auto mid = (primero + ultimo)/2;
auto pivot = *mid;
i = primero;
j = ultimo;
do{
while(*i < pivot) i++;
while(*j > pivot) j--;
if(i <= j){
swap(*i,*j);
i++;
j--;
}
}while(i <=j);
if(primero < j){
sort(cnt, primero, j);
}
if( i < ultimo){
sort(cnt, i, ultimo);
}
}
template<typename T>
void swap(T x, T y) {
T aux;
aux = x;
x = y;
y = aux;
}
};
我遇到的错误:
/home/eduardo/Desktop/Utec/Poo2/Proyecto2/unidad-2-ordenamiento-Marcuss17/Sort.h:11:9: required from ‘void Sorter<SortMethod>::operator()(container, Types ...) [with container = std::vector<int>; Types = {__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >}; SortMethod = QuickSort]’
/home/eduardo/Desktop/Utec/Poo2/Proyecto2/unidad-2-ordenamiento-Marcuss17/main.cpp:14:27: required from here
/home/eduardo/Desktop/Utec/Poo2/Proyecto2/unidad-2-ordenamiento-Marcuss17/Quick.h:12:29: error: no match for ‘operator+’ (operand types are ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ and ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’)
auto mid = (primero + ultimo)/2;
~~~~~~~~~^~~~~~~~~
根据编译器错误消息,似乎primero
和ultimo
的类型为std::vector<int>::iterator
。因此,primero + ultimo
不是有效的操作。
您需要使用
auto mid = (*primero + *ultimo)/2; // Dereference the iterator to get an int.
代替
auto mid = (primero + ultimo)/2;