调用 basic_string::copy 没有匹配的函数
Posted
技术标签:
【中文标题】调用 basic_string::copy 没有匹配的函数【英文标题】:no matching function for call basic_string::copy 【发布时间】:2013-06-02 04:39:34 【问题描述】:我对 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
【问题讨论】:
如果您查看一些文档或错误的其余部分,它会说它接受char *
(或使用的任何字符串)。我建议使用substr
。
【参考方案1】:
引用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;
这会直接从构造函数中的 old 字符串创建 new 字符串,所以它更优雅一些。
让您知道为什么会发生错误,变量的数据类型(int
、char
、string
等)必须与函数期望的数据类型相匹配接受。如果您不知道函数期望接收的数据类型,您可以随时在 Google 上查找。
另外,你需要使用:
strTuna = Cut(strHate, 7, 4)
代替:
strTuna = Cut(strHate, 8, 4)
这是因为字符串的第一个字符的位置是0
,而不是1
。
【讨论】:
谢谢,basic_string::copy 被提及为 std::string 中的成员字符串,所以我只是假设它没有使用 c 样式的字符串。至于那个一点一点的错误,我们都会犯错误,不是吗?哈哈哈 是的,我自己也很惊讶 @KleptoKat,您必须记住,我们确实有std::string::substr
可以复制到 std::string
,std::copy
可以复制到其中一个(以及更多),std::string::copy
可以复制到一个 C 字符串。我不确定为什么要实现最后一个,除非它使用memmove
或其他东西,但我们已经有了另外两个可以处理 C++ 字符串的东西。而我就是我,我忘记了构造函数也可以从一对迭代器中复制,所以对于 C++ 字符串来说还有 1 个,它提醒我 std::string::assign
也可以做到这一点。【参考方案2】:
在您的情况下使用string::substr
可能更合适:
string Cut(string &str, int nStart, int nLength)
string strCopy = str.substr(nStart, nLength);
str.erase(nStart, nLength);
return strCopy;
【讨论】:
以上是关于调用 basic_string::copy 没有匹配的函数的主要内容,如果未能解决你的问题,请参考以下文章
云图说|OLAP开源引擎的一匹黑马,MRS集群组件之ClickHouse