这是我使用注释的第一个代码,我知道注释并不完美。 当我尝试构建代码时,编译器给我这个错误
没有匹配函数可调用'make_pair(char [len],int&)。
我想用std::pair
返回两个变量
请注意:我只想调试此代码,所以不要写自己的方式来做我想在第一阶段做的事情。
我使用的是gcc 5.1,我的操作系统是Windows
/* this program takes an string from user and output its morse code equivalent */
#include <iostream>
#include <cstring>
#include <algorithm>
#include <utility>
using namespace std;
/* getString() is for getting a text with type std::string and converse all the letters in it
to lower case in order to switch case then converse std::string text type to cstring to be able to loop through it with
for loop*/
pair<const char*, int> getString()
{
string a;
getline(cin, a);
// converse all the letters in string a to lower case for switch case
transform(a.begin(), a.end(), a.begin(), ::tolower);
int len = a.length() + 1;
char ch[len];
strcpy(ch, a.c_str());
return make_pair(ch, len); //this line causing error
}
int main() {
p = pair<const char*, int> getString();
char ch = p.first;
int len = p.second;
string morseCode;
/*this for loop search in the ch character array and add morse code equivalent of each letter to morseCode
string Variab*/
for (int i = 0; i < len; i++)
switch(ch[i])
{
case ' ':
morseCode += "/ ";
break;
case 'a':
morseCode += ".- ";
break;
case 'b':
morseCode += "-... ";
break;
case 'c':
morseCode += "-.-. ";
break;
case 'd':
morseCode += "-.. ";
break;
case 'e':
morseCode += ". ";
break;
case 'f':
morseCode += "..-. ";
break;
case 'g':
morseCode += "--. ";
break;
case 'h':
morseCode += ".... ";
break;
case 'i':
morseCode += ".. ";
break;
case 'j':
morseCode += ".--- ";
break;
case 'k':
morseCode += "-.- ";
break;
case 'l':
morseCode += ".-.. ";
break;
case 'm':
morseCode += "-- ";
break;
case 'n':
morseCode += "-. ";
break;
case 'o':
morseCode += "--- ";
break;
case 'p':
morseCode += ".--. ";
break;
case 'q':
morseCode += "--.- ";
break;
case 'r':
morseCode += ".-. ";
break;
case 's':
morseCode += "... ";
break;
case 't':
morseCode += "- ";
break;
case 'u':
morseCode += "..- ";
break;
case 'v':
morseCode += "...- ";
break;
case 'w':
morseCode += ".-- ";
break;
case 'x':
morseCode += "-..- ";
break;
case 'y':
morseCode += "-.-- ";
break;
case 'z':
morseCode += "--.. ";
break;
}
cout << morseCode;
return 0;
}
答案 0 :(得分:1)
您不能以const char*
的形式返回堆栈分配的字符数组,因为该数组在函数结束后将不再存在,并且指针将指向无效的位置。
还请注意,在堆栈上创建大小可变的数组是gcc扩展,它是非标准的。
只返回std::string
会容易得多,那么您根本就不需要一对。
顺便说一句,我认为要解决配对问题,您需要将字符数组转换为const char *
答案 1 :(得分:0)
针对编译器错误,我给出了以下最小示例。
SelectElement Select = new SelectElement(driver.FindElement(By.Id("ddlCUcardNo")));
Select.SelectByIndex(2);
db.col.aggregate([
{
$match: {
"_id": "5b3ad55f66479332a0482961",
"timestamp": "2018-06-17T00:30:00.000Z"
}
},
{
$addFields: {
values: {
$map: {
input: "$values",
as: "value",
in: {
minval: "$$value.minval",
minvalues: {
$filter: {
input: "$$value.minvalues",
as: "minvalue",
cond: {
$eq: [ "$$minvalue.secvalues.priority", 0 ]
}
}
}
}
}
}
}
}
])
是一个函数模板,它将在编译时基于变量#include <algorithm>
#include <utility>
using namespace std;
int main() {
int len = 10;
char ch[len];
make_pair(ch, len); //this line causing error
}
创建一个函数,该变量只能在运行时知道。这源于make_pair
是一个可变长度数组,由于类似的问题,在标准C ++中这是非法的。尽管使用了可变长度数组之后,您应该会看到len
的恐怖,但这已经不再是话题了。
最好的解决方案是始终坚持char ch[len];
,但要与产生sizeof
保持一致,
std::string
完成后,请记住pair<const char*, int>
分配的存储。这也将修复Alan Birtles发现的错误。注意:You could also use a smart pointer,但是如果您愿意走那么远,则走四分之一远,然后使用int main() {
int len = 10;
char * ch = new char[len];
make_pair(ch, len);
}
。
在
delete
std::string
需要一种类型。当前该类型放置在错误的位置
p = pair<const char*, int> getString();
这也是使用p
的好地方。
pair<const char*, int> p = getString();
下一步
auto
auto p = getString();
是char ch = p.first;
,而不是p.first
。
那应该可以编译您的代码。剩下的就是逻辑错误。
答案 2 :(得分:0)
您可以使用std::string
。
这样,您可以使用size()
的{{1}}方法来获取其长度。
您还可以返回本地std::string
变量,这将使用move语义为您提供正确的返回值。
如果您确实想使用std::string
,您仍然可以将std::pair
传递给它-std::string
,但是如果std::pair<std::string, int>
表示字符串长度,则不需要