错误:没有用于调用'reverse'的匹配函数:忽略候选模板:推导出参数的冲突类型

时间:2015-02-16 12:46:49

标签: c++ function debugging

我编写了以下C ++代码来生成输入字符串的下一个逆字母顺序。但是我得到错误说:没有匹配函数用于调用'反向':候选模板被忽略:推导出参数的冲突类型       ' _BidirectionalIterator' (' std :: __ 1 :: basic_string' vs.' int') 反向(_BidirectionalIterator __ first,_BidirectionalIterator __last)。 我无法理解错误消息,也不知道如何调整它。谁能帮到我这里?谢谢!

#include<iostream>
#include<string>
using namespace std;

string gen(string A,int n){ 
    int i, j;
    for(i= n-1;(i > 0 && A[i-1]<A[i]);i--)
        ; // empty statement
    if (i == 0)
        return 0;
    for (j = i+1; j < n && A[i-1] > A[j]; j++)
        ; // empty statement

    swap(A[i-1],A[j-1]); // swap values in the two entries
    string subline =A.substr(i,n-i);
    subline=reverse(subline,n-i);
    A=A.substr(0,i-1)+subline;
    return A;
}

void swap(int &a,int &b)
{
    int temp=b;
    b=a;
    a=temp;
}

string reverse(string k,int length)
{    
    for(int m=0;m<length/2;m++)
    {
        char temp=k[length-1-m];
        k[length-1-m]=k[m];
        k[m]=temp;
    }
    return k;
}

int main(void)
{
    cout<<"Please enter a string"<<endl;
    string arrayperm;
    cin>>arrayperm;
    int length=arrayperm.length();    
    string newone=gen(arrayperm,length);
    cout<<"The new array is: "<<newone<<endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果您将反向函数移动到文件顶部并将其嵌套在namespace中,则可以编译代码,例如:

namespace oops{
    string reverse(string k, int length)
    {
        for (int m = 0; m < length / 2; m++)
        {
            char temp = k[length - 1 - m];
            k[length - 1 - m] = k[m];
            k[m] = temp;
        }
        return k;
    }
}

然后当你调用它时:subline = oops::reverse(subline, n - i);

但是,正如目前实施的那样,它会运行,但不会反转string。我建议不要重新发明轮子:

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int main(void)
{
    string arrayperm = "Lorem ipsum";
    string newone(arrayperm.size(), '\0');

    reverse_copy(arrayperm.begin(), arrayperm.end(), newone.begin());

    cout << "The new array is: " << newone << endl;
    return 0;
}