所以我正在编写一个程序,其中一个功能是确定该字符是否是元音。该计划如下:
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'的匹配函数”。
答案 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引用而不是引用的另一个原因。您也可以使用价值语义,但我同意您的参考结论。