为什么使用文字数字进行引用调用时出现“无匹配函数”错误?

时间:2019-10-09 06:03:29

标签: c++

问题要求创建一个程序,该程序要求用户输入一些文本,并且文本将根据屏幕的宽度被星号包围,例如,如果用户输入“ Hello world”,则输出应为:

****************
* Hello World! *
****************

我试图创建函数,但是由于显示的最少代码导致编译器错误,我被卡住了。

问题:为什么它告诉我no matching function的{​​{1}}?

下面有一些代码:

within_width(text, 80)

3 个答案:

答案 0 :(得分:2)

此函数的声明

bool within_width (std::string& text, unsigned short int& max_width)

询问无符号的短整数变量,因为它具有参考参数,请参见第二个

要满足此要求,您需要将值80放入变量并将变量作为参数。

unsigned short int MyWidth=80;
if (within_width(text, MyWidth))

或者(但我假设您是不允许的),您可以使用按值参数调用

bool within_width (std::string& text, unsigned short int max_width)

然后您可以如图所示致电。

答案 1 :(得分:0)

在这里,我不会给出完整的答案,只是一些线索。

  • display_header()within_width()函数需要知道参数中给出的字符串,但不能对其进行修改;因此此参数的类型应为const std::string &(缺少const)。
  • within_width()函数的第二个参数只是一个整数,将与字符串的长度进行比较;您不需要通过引用(或至少为const),而是通过值来传递它。此处,(非{const)引用可防止传递文字常量80
    (这似乎是版本后问题的主要关注点)
  • 您需要逐步推理。
    1. 所有这些取决于字符串的大小(Hello World!为12);此信息可通过size(text)(或text.size())获得
      https://en.cppreference.com/w/cpp/iterator/size
      https://en.cppreference.com/w/cpp/string/basic_string/size
    2. 该大小必须与max_width
    3. 进行比较
    4. header显示行将需要另外4个字符,因为*会被前置,*会被附加。
    5. 因此,两条周围的线的长度也将为size(header)+4
    6. 要创建由*组成的字符串,可以使用std::string的构造函数,该构造函数具有两个参数:字符数和要重复的字符。
      https://en.cppreference.com/w/cpp/string/basic_string/basic_string
    7. 以正确的顺序将所有这些内容发送到std::cout

答案 2 :(得分:0)

编辑: 只是注意到此答案可能远远超出了您已完成的任务的范围(仅填写已提供的某些框架)由您的老师)。

我仍将其留在此处以说明使用任意输入可以完成。也许您想比您要求的做更多的尝试...

bool within_width(...)

非常简单:string.length() <= max –请稍等片刻,您需要在输出的开头和结尾考虑星号和空格,因此:max - 4

但是您可以做得更好,可以对字符串进行分割,最好是在单词边界处。不过,这有点困难,但更困难:

std::vector<std::string> lines;

// we'll be starting with an initially empty line:
auto lineBegin = text.begin();
auto lineEnd = text.begin();

for(auto i = text.begin(); i != text.end(); ++)
// stop condition empty: we'll stop from inside the loop...
{
    // ok, we need to find next whitespace...
    // we might try using text.find_first_of("..."), but then we
    // need to know any whitespace characters ourselves, so I personally
    // would rather iterate manually and use isspace function to determine;
    // advantage: we can do other checks at the same time, too

    auto distance = std::distance(lineBegin, i);
    if(std::distance(lineBegin, i) > maxLineLength)
    {
         if(lineEnd == lineBegin)
         {
             // OK, now we have a problem: the word itself is too long
             // decide yourself, do you want to cut the word somewhere in the
             // middle (you even might implement syllable division...)
             // or just refuse to print (i. e. throw an exception you catch
             // elsewhere) - decide yourself...
         }
         else
         {
             lines.emplace_back(lineBegin, lineEnd);
             lineBegin = lineEnd; // start next line...
         }
    }

    // OK, now handle current character appropriately
    // note: no else: we need to handle the character in ANY case,
    // if we terminated the previous line or not
    if(std::isspace(static_cast<unsigned char>(*i)))
    {
         lineEnd = i;
    }
    // otherwise, we're inside a word and just go on
}
// last line hasn't been added!
lines.emplace_back(lineBegin, lineEnd);

现在,您可以计算包含的所有字符串的最大长度。最好:在向向量添加新行时这样做是正确的,那么您就不需要单独的循环...

您可能已经注意到,我没有删除字符串末尾的空格,因此,除了最后一个字符串之外,您不需要添加自己的空格(因此,您可以添加{{ 1}})。

到目前为止,丑陋的部分是我留下了多个后续空白。最好的做法是删除 before 分割成几行,但要注意,您至少需要保留一个。所以:

lines.back() += ' ';

这会将所有单词移到字符串的开头,但是我们尚未删除字符串剩余的部分:

 auto end = text.begin();
 bool isInWord = false; // will remove leading whitespace, if there is
 for(auto c : text)
 {
     if(std::isspace(static_cast<unsigned char>(c)))
     {
         if(isInWord)
         {
             *end++ = ' '; // add a single space
             isInWord = false;
         }
     }
     else
     {
         *end++ = c;
         isInWord = true;
     }
 }

好的,其余的很简单:

  • 重复最大长度,在每个循环中打印一个星号
  • 遍历向量中的所有字符串:
    text.erase(end, text.end());
  • 重复初始循环以打印第二行星号

最后:您引入了80个字符的固定行限制。如果控制台更大,您将不会使用整个可用宽度,但是这可能是可以接受的;如果控制台更小,则会在错误的位置处折断行。

您现在可以(但是这是可选的)尝试检测控制台的宽度-以前是asked,所以我将不做进一步介绍。

最后一点:上面提供的代码未经测试,因此不能保证没有错误!