模板问题

时间:2015-05-19 19:46:01

标签: c++ templates

我有这个简单的排序程序应该适用于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;
}

3 个答案:

答案 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){

现在,对于vectype只能是Set<int>,而对于cmptype只能是Set<int>&。两者都没有合在一起,因此错误。