没有匹配的函数来调用'make_pair(char [len],int&)

时间:2018-07-03 04:45:35

标签: c++ arrays return std-pair

这是我使用注释的第一个代码,我知道注释并不完美。 当我尝试构建代码时,编译器给我这个错误

  

没有匹配函数可调用'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;
}

3 个答案:

答案 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>表示字符串长度,则不需要