我是C ++新手,正在编写一个简单的程序来testing使用string。 我已经定义了一个单独的函数,返回一个string,并希望在主方法中调用它。 相同的代码在主要方法内工作,但我需要将其定义为一个单独的函数。
我的代码如下:
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(); ^
在C#中将文件中的行结束符从DOS转换为UNIX格式
如何在C ++中input密码到ssh?
应该在UWP应用程序中使用哪个命名空间类httpClIEnt?
如何避免与windows头文件中定义的macros名称冲突?
WPF和窗口平铺
如何在linux中使用objdump和bash函数在共享对象文件中find函数?
如何写多个从i2c客户端设备驱动程序?
linux – 如何更改C中分叉进程的信息
vector投掷bad_alloc
libpthread.so继续在`dlclose()`之后使用TLS空间和DL命名空间
守则中的问题
你命名变量名称和函数名称, hi ,所以编译器弄糊涂你的意思。
解决方案1
正如@Cheersandhth所说,这样做:
hi = ::hi();
在全局命名空间中获取全局hi ,这就是函数。
现场示例
解决方案2
否则,如果要更改变量名称,则可以将函数名称或变量更改为不同的值,然后运行。 这里是一个例子:
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!\”; }
这两个解决方案都可以工作,你想使用的解决方案将是一个优先事项。 此外,使用这个答案作为建议,不要做名称阴影,这可能会导致编译器挑选两个名称之一(如果他们适合正确的上下文),或者可能会引发错误。
解决方案3
等等,还有第三个解决方案?
是的,但解决方案三是更多的解决方法,但我更喜欢它。 只要摆脱变量本身,和这样的cout :
cout << hi(); //So simple!
你用你的变量名称来映射你的函数声明。 你可以做两件事之一:
重命名函数或变量。 (例)
在调用中限定名称,这将涉及调用函数的名称空间(即全局名称空间),如下所示::hi() 。 (例)
我相信这个错误信息是相当清楚的:主要的hi隐藏了全局的hi-function。 在另一个地方使用另一个名字或范围函数:hi = hi()=> hi = :: hi();
尝试
string hi(); int main(int argc,char** argv) { string _hi; _hi = hi(); cout << hi << endl; } string hi() { return \”Hello World\”; }
编译器抛出错误的原因是因为它是在函数调用后解析括号。 但是C ++中的string类没有函数调用 *** 作符的成员函数。 所以,当它看到hi()时会感到困惑,因为它认为你正在谈论刚刚在前一行声明的string hi变量。 因此,为了区分hi变量和返回string的hi()函数,可以执行以下一项或两项 *** 作:
您可以将您的本地声明的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!\”; }
因为类可以重载函数调用 *** 作符,它有时看起来像是在调用一个普通的函数,但编译器可能正在调用函数调用 *** 作符。 好的命名实践可以帮助最大限度地减少这些问题,但是有时您可能需要具体一些,包括全局命名空间限定符来向编译器阐明你的意思(即,如果string类具有定义的函数调用 *** 作符,则不会有编译器错误,但你不会得到你想要的答案)。
总结
以上是内存溢出为你收集整理的在main方法中调用一个返回String的函数全部内容,希望文章能够帮你解决在main方法中调用一个返回String的函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容