调用在main方法中返回String的函数

时间:2016-08-29 22:52:09

标签: c++ linux

我是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();
         ^

5 个答案:

答案 0 :(得分:6)

使用变量名称隐藏函数声明。你可以做两件事之一:

  1. 重命名函数或变量。 (example)
  2. 在调用中限定名称,这将涉及调用函数的命名空间(即全局命名空间),如下所示:::hi()(example)

答案 1 :(得分:5)

代码中的问题

您将变量名称和函数名称命名为hi,因此编译器会对您指的是哪一个感到困惑。

解决方案1 ​​

正如@Cheersandhth所说,做到这一点:

hi = ::hi();

在其全局命名空间中获取全局hi,这是函数。

Live Example

解决方案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!

答案 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}}函数区分开来,您可以执行以下一项或两项操作:

  1. 您可以将本地声明的string变量重命名为与全局函数不匹配的变量,反之亦然。
  2. 您可以使用全局命名空间限定符为函数调用添加前缀,以告诉编译器您正在使用全局string函数。 (即hi())。
  3. 第一个例子:

    ::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!"; } 类具有函数调用操作符定义,那么将没有编译器错误,但你不会得到你想要的答案。