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;
}

「ここでエラーが発生しました」と書かれているところに、コンパイル中に次のエラーが表示されます。

4

5 に答える 5

22

文字列と関数に同じ名前を付けないでください。エラーはなくなります。

同じ名前のローカル変数を宣言すると、コンパイラはその名前の関数があることを「忘れて」います。

于 2009-10-10T18:13:53.317 に答える
5

ローカル変数は、グローバル関数の名前をシャドウします。ローカル変数の名前を変更するのが最善ですが、グローバル名に具体的にアクセスできるスコープ演算子もあります。

initialDecision = ::initialDecision();
于 2009-10-10T19:04:42.543 に答える
5

これは、C++ では「名前の隠蔽」と呼ばれます。この特定の例では、名前空間スコープの関数と同じ名前を持つローカル変数を宣言しています。その変数の宣言の時点の後、関数はhiddenになり、「initialDecision」名に言及するたびに、コンパイラは、変数を参照していると当然のことながら想定します。関数呼び出し演算子 '()' を 'string' 型の変数に適用できないため、コンパイラはエラー メッセージを発行します。

多くの場合、隠し名前を参照するには、スコープ解決演算子 '::' を使用できます。たとえば、UncleBens の応答を参照してください。

于 2009-10-10T19:13:59.517 に答える
1

関数の名前と一致しないように変数の名前を変更してみてください。

于 2009-10-10T18:13:22.180 に答える
1

問題は、変数と関数の両方として名前 initialDecision を繰り返していることです。これはコンパイラを大いに混乱させます。変数の名前を別の名前に変更してみてください。その後、動作します。

于 2009-10-10T18:14:34.690 に答える