在C ++中没有bool函数的参考参数?

时间:2014-04-14 20:28:02

标签: c++ reference

所以我正在编写一个程序,其中一个功能是确定该字符是否是元音。该计划如下:

bool is_vowel(string s)
{
    if (s == "A" || s == "a") return true;
    if (s == "E" || s == "e") return true;
    if (s == "I" || s == "i") return true;
    if (s == "O" || s == "o") return true;
    if (s == "U" || s == "u") return true;
    if (s == "Y" || s == "y") return true;

    return false;
}

所以当我尝试将字符串s转换为参考参数字符串&时,我的问题出现了。秒。在更改之后,每当我尝试调用此函数时,程序(我在Mac上使用Xcode btw)告诉我"No matching function for call to 'is_vowel'",即使IS中的对象是一个字符串对象。那么为什么我不能在这里使用参考参数呢?是不是“s”指的是我用来调用这个函数的字符串?我使用了大多数函数的参考参数,我没有改变任何东西,因为我认为引用而不是将值复制到新参数可能更有效。那为什么它在这里不起作用? 顺便说一下,“引用而不是将值复制到新参数更有效”是真的吗?

编辑:根据许多人的要求,我只需添加另一个调用此函数的函数;为了简单起见,我已经切断了很大一部分代码。所以不要过多地关注这部分的逻辑。

int FRI_Syllables(vector<string>& s)
{
    int syllables = 0;

    for (int i = 0; i < s.size(); i++)
    {
        string word = s[i];

        for (int n = 0; n < word.length(); n++)
        {
            if (is_vowel(word.substr(n, 1)))
                syllables ++; //Rule 1: count each vowel as a syllable
        }
    }

    return syllables;
}

至于bool函数的更改,除了第一行

之外,其他一切都是相同的
bool is_vowel(string& s)

并且Xcode给出的错误是“没有用于调用'is_vowel'的匹配函数”。

1 个答案:

答案 0 :(得分:3)

首先,当你不像这个特殊情况那样改变值时,你想使用const引用而不是引用。

其次,角色的字符串是过度的。

第三,代码对我来说很好,如下:

#include <iostream>
#include <string>

using namespace std;

bool is_vowel(const string &s)
{
    if (s == "A" || s == "a") return true;
    if (s == "E" || s == "e") return true;
    if (s == "I" || s == "i") return true;
    if (s == "O" || s == "o") return true;
    if (s == "U" || s == "u") return true;
    if (s == "Y" || s == "y") return true;

    return false;
}

int main()
{
    string mystring = "b";
    string mystring2 = "A";
    cout << is_vowel(mystring) << endl;
    cout << is_vowel(mystring2) << endl;
    return 0;
}

如果我只是传递一个字符串文字,我可以重现你的问题:

  

main.cpp:24:25:错误:'std :: string&amp;类型的非const引用的初始化无效来自'const char *'类型的右值的{aka std :: basic_string&amp;}'        cout&lt;&lt; is_vowel(&#34; f&#34;)&lt;&lt; ENDL;

如果是这种情况,这是使用const引用而不是引用的另一个原因。您也可以使用价值语义,但我同意您的参考结论。