我是C ++的新手,正在编写一个简单的程序来测试使用字符串。我已经定义了一个单独的函数,它返回一个字符串,并希望在main方法中调用它。相同的代码在main方法中工作,但我需要将其定义为单独的函数。
我的代码如下:
7 #include <cstdlib>
8 #include <iostream>
9 #include <string>
10
11 using namespace std;
12
13 // function declaration
14 string hi();
15
16 int main(int argc, char** argv) {
17 // call method
18 string hi;
19 hi = hi();
20 cout << hi << endl;
21 }
22
23 string hi() {
24 //simple string function
25 return "Hello World";
26 }
以下是我尝试使用g ++编译时返回到控制台的错误:
test.cpp: In function ‘int main(int, char**)’:
test.cpp:19:13: error: no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string<char>}) ()’
hi = hi();
^
答案 0 :(得分:6)
使用变量名称隐藏函数声明。你可以做两件事之一:
答案 1 :(得分:5)
您将变量名称和函数名称命名为hi
,因此编译器会对您指的是哪一个感到困惑。
正如@Cheersandhth所说,做到这一点:
hi = ::hi();
在其全局命名空间中获取全局hi
,这是函数。
<小时/> 否则,如果要更改变量名称,可以将函数名称或变量更改为其他值,然后它将起作用。这是一个例子:
int main(int argc, char** argv)
{
string l_hi;
l_hi = hi();
cout << l_hi;
}
或替代方案:
int main(int argc, char** argv)
{
string hi;
hi = hello();
cout << hi;
}
string hello()
{
return "Hello, World!";
}
这两种解决方案都可以使用,您想要使用的解决方案是优先考虑的问题。另外,使用此答案作为不进行名称遮蔽的建议,这可能导致编译器选择两个名称中的一个(假设它们适合正确的上下文),或者可能引发错误。
等等,还有第三个解决方案吗?
是的,但是解决方案三更像是一种解决方法,尽管我更喜欢它。只需摆脱变量本身,cout
就像这样:
cout << hi(); //So simple!
答案 2 :(得分:1)
我相信错误信息非常明确:主要的hi隐藏了全局的高功能。在某处使用其他名称或使用该功能:hi = hi()=&gt; hi = :: hi();
答案 3 :(得分:1)
尝试
string hi();
int main(int argc, char** argv) {
string _hi;
_hi = hi();
cout << hi << endl;
}
string hi() {
return "Hello World";
}
答案 4 :(得分:1)
编译器抛出错误的原因是因为它在hi
之后将括号解析为函数调用。但是C ++中的string
类没有函数调用操作符成员函数。所以,当它看到hi()
时会感到困惑,因为它认为你在谈论你刚刚在前一行声明的string hi
变量。因此,要将hi
变量与返回hi()
的{{1}}函数区分开来,您可以执行以下一项或两项操作:
string
变量重命名为与全局函数不匹配的变量,反之亦然。string
函数。 (即hi()
)。第一个例子:
::hi()
第二个例子:
#include <iostream>
#include <string>
using namespace std;
string hi();
int main(int argc, char** argv) {
string my_hi;
my_hi = hi();
cout << my_hi << endl;
return 0;
}
string hi() {
return "Hello, world!";
}
因为类可以重载函数调用操作符,所以它有时看起来像是在调用普通函数,但编译器可能正在调用函数调用操作符。良好的命名实践可以帮助最小化这些问题,但有时您可能需要具体并包含全局命名空间限定符以向编译器阐明您的意思(即,如果#include <iostream>
#include <string>
using namespace std;
string hi();
int main(int argc, char** argv) {
string hi;
hi = ::hi();
cout << hi << endl;
return 0;
}
string hi() {
return "Hello, world!";
}
类具有函数调用操作符定义,那么将没有编译器错误,但你不会得到你想要的答案。