调用basic_string :: copy没有匹配函数

时间:2013-06-02 04:39:34

标签: c++ string copy stdstring

我对C ++很陌生,并且已经习惯了一段时间。如果对这些错误有任何见解,我将非常感激。以下程序应产生以下结果:

#include <iostream>
#include <string>

using namespace std;

string Cut(string &strString, int nStart, int nLength)
    {
        string strCopy;
        strString.copy(strCopy, nLength, nStart);
        strString.erase(nStart, nLength);
        return strCopy;
    }

int main()
{
    string strHate = "I hate tuna.";
    cout << strHate << endl;
    string strTuna;
    strTuna = Cut(strHate, 8, 4);
    cout << strHate << endl;
    cout << strTuna << endl;
}

应该产生

I hate tuna.
I hate .
tuna

然而,我收到此错误消息:

9|error: no matching function for call to 'std::basic_string<char>::copy(std::string&, int&, int&)'

非常感谢,

KleptoKat

2 个答案:

答案 0 :(得分:2)

在引用here时,函数std::string.copy采用char *类型的参数,您已为其指定了string类型的参数

这是一个更好的解决方案:

string Cut(string &strString, int nStart, int nLength){
    string strCopy (strString, nStart, nLength);
    strString.erase(nStart, nLength);
    return strCopy;
}

这将直接从构造函数中创建字符串中的 new 字符串,因此它更加优雅。

只是您知道为什么发生了错误,变量的数据类型(intcharstring等)必须与函数期望接收的数据类型。如果您不知道函数期望接收哪些数据类型,您可以随时在Google上查找。

此外,您需要使用:

strTuna = Cut(strHate, 7, 4)

而不是:

strTuna = Cut(strHate, 8, 4)

这是因为字符串的第一个字符的位置为0而不是1

答案 1 :(得分:1)

在您的情况下使用string::substr可能更合适:

string Cut(string &str, int nStart, int nLength)
{
  string strCopy = str.substr(nStart, nLength);
  str.erase(nStart, nLength);
  return strCopy;
}