5

我正在尝试用 C++ 编译以下代码

string initialDecision () 
{
 char decisionReviewUpdate;

 cout << "Welcome. Type R to review, then press enter." << endl;
 cin >> decisionReviewUpdate;

 // Processing code
}

int main()
{
    string initialDecision;
    initialDecision=initialDecision();

    //ERROR OCCURS HERE

 // More processing code
 return 0;
}

就在它说“这里发生错误”的地方,我在编译时收到以下错误:“错误:不匹配调用'(std :: string)()'。我该如何解决这个问题?

4

5 回答 5

22

不要给你的字符串和你的函数同名,错误就会消失。

当您声明具有相同名称的局部变量时,编译器“忘记”了具有该名称的函数。

于 2009-10-10T18:13:53.317 回答
5

局部变量隐藏了全局函数的名称。最好重命名局部变量,但还有范围运算符可以让您专门访问全局名称:

initialDecision = ::initialDecision();
于 2009-10-10T19:04:42.543 回答
5

这在 C++ 中称为“名称隐藏”。在此特定示例中,您要声明一个局部变量,该变量与命名空间范围内的函数具有相同的名称。在该变量的声明点之后,该函数变为hidden,并且每次您提及“initialDecision”名称时,编译器都会正确地假定您指的是该变量。由于您不能将函数调用运算符“()”应用于“字符串”类型的变量,因此编译器会发出错误消息。

在许多情况下,为了引用隐藏名称,您可以使用范围解析运算符'::'。例如,参见 UncleBens 的回应。

于 2009-10-10T19:13:59.517 回答
1

尝试将变量重命名为与函数名称不匹配。

于 2009-10-10T18:13:22.180 回答
1

问题是您将名称 initialDecision 重复为变量和函数。这极大地混淆了编译器。尝试将变量重命名为其他名称;然后它将起作用。

于 2009-10-10T18:14:34.690 回答