我有这个简单的排序程序应该适用于Set<int>
- s的向量,它适用于基本类型,我使用其他一些比较函数用于非基元,它运行良好,但是一旦我尝试比较集合它崩溃了,错误:
error C2782: 'void Sort(Vector<ElemType> &,int (__cdecl *)(type,type))' : template parameter 'type' is ambiguous
我该如何解决这个问题?
template <typename type>
void swap(int &a, int &b){
type tmp =a;
a = b;
b = tmp;
}
template <typename type>
void Sort(Vector<type>& vec,int (cmp) (type,type) = OperatorCmp ){
while(true){
for(int i =1; i < v.size(); i++){
if(cmp(v[i-1],v[i]) > 0){
break;
}else{
return;
}
}
int index1 = RandomInteger(0,vec.size()-1);
int index2 = RandomInteger(0,vec.size()-1);
swap(vec[index1],vec[index2]);
}
}
int main(){
Randomize();
Vector<char>a;
Sort(a);
return 0;
}
答案 0 :(得分:2)
type
被推断为对函数指针参数的Set<int>
的引用和对容器的值类型的Set<int>
的引用,这是一个不一致的推论。最简单的解决方案:完全概括仿函数:
template <typename type, typename Fun>
bool isSorted(Vector<type> & vec, Fun cmp){
for(int i =0; i < vec.size()-1; i++){
if(cmp(vec[i],vec[i+1]) > 0)return false;
}
return true;
}
..和单参数情况下的重载。
答案 1 :(得分:2)
您的类型不匹配。 bozoSort
声明为:
template <typename T>
void bozoSort(Vector<T>& vec, int (cmp) (T,T) );
当您使用a
调用它时,您希望推断T = Set<int> >
,这将是签名:
void bozoSort(Vector<Set<int> >& vec, int (cmp) (Set<int>, Set<int> ));
但是,您可以使用compareSets
来调用它,该int (Set<int>&, Set<int>&)
具有签名template <typename T, typename Compare>
void bozoSort(Vector<T>& vec, Compare cmp) { ... }
。那些不匹配,因此编译器无法为您解析模板。更好的解决方案就是将整个比较器作为模板:
user> (trampoline #(inc 41))
42
这样,如果你希望你的比较器通过引用,const引用或值来获取它的参数 - 上面的任何一个都可以正常工作。
答案 2 :(得分:1)
你有
template <typename type>
void bozoSort(Vector<type>& vec,int (cmp) (type,type) = OperatorCmp )
你用
来调用它vec = Vector<Set<int>>
和
cmp = compareSets
是
int compareSets(Set<int>& a , Set<int>& b){
现在,对于vec
,type
只能是Set<int>
,而对于cmp
,type
只能是Set<int>&
。两者都没有合在一起,因此错误。