Ошибка C ++: нет соответствия для вызова - PullRequest
2 голосов
/ 10 октября 2009

Я пытаюсь скомпилировать следующий код в 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) ()'. Как я могу решить эту проблему?

Ответы [ 5 ]

16 голосов
/ 10 октября 2009

Не присваивайте вашей строке и вашей функции одно и то же имя, и ошибка исчезнет.

Компилятор "забыл", что существует функция с таким именем, когда вы объявляете локальную переменную с тем же именем.

4 голосов
/ 10 октября 2009

Локальная переменная скрывает имя глобальной функции. Лучше всего переименовать локальную переменную, но есть также оператор области действия, который позволяет вам конкретно обращаться к глобальному имени:

initialDecision = ::initialDecision();
3 голосов
/ 10 октября 2009

Это называется "скрытием имени" в C ++. В этом конкретном примере вы объявляете локальную переменную, имя которой совпадает с именем функции в области пространства имен. После точки объявления этой переменной функция становится скрытой , и каждый раз, когда вы упоминаете имя 'initialDecision', компилятор будет по праву считать, что вы ссылаетесь на переменную. Поскольку вы не можете применить оператор вызова функции '()' к переменной типа 'string', компилятор выдает сообщение об ошибке.

Во многих случаях для обращения к скрытым именам вы можете использовать оператор разрешения области '::'. См. Ответ UncleBens, например.

1 голос
/ 10 октября 2009

Проблема в том, что вы повторяете имя initialDecision как переменную и функцию. Это сильно смущает компилятор. Попробуйте переименовать переменную в другое; тогда это будет работать.

1 голос
/ 10 октября 2009

Попробуйте переименовать переменную, чтобы она не соответствовала названию функции.

...