1

いくつかのオーバーロードされた関数を連鎖させようとしています。それは本当に単純なはずですが、エラーが発生しています。コードは次のとおりです。

void output(char c[])
{
    output(c, 0);
}

void output(char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
}

void output(char c[], int x, int y)
{
    cout << c;
}

int main()
{
    output("myname");
    output("myname", 3);
    output("myname", 2, 4);
}

私が得ているエラーは、チェーンされた部分 (output(c, 0);output(c, x, l);. エラーは次のとおりです。

"No matching function for call to 'output (char *&, int)'
"No matching function for call to 'output (char *&, int &, int &)'

私が間違ったことの説明も良いでしょう。

4

3 に答える 3

7

問題は、関数にプロトタイプがないという事実に関係していると思います。そのような場合は、呼び出す関数が呼び出す関数より前に表示されるように、関数の順序を変更する必要があります。

void output(const char c[], int x, int y)
{
    cout << c;
}
void output(const char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
} 
void output(const char c[])
{
    output(c, 0);
}

しかし、関数を定義する前に、すべての関数のプロトタイプを使用することに固執するのが最善です。

また、文字列リテラルはconst. 関数は文字列リテラルの内容を変更しないため、const char c[]代わりに を宣言する必要がありchar c[]ます。

于 2012-08-19T20:54:42.423 に答える
3

後で使用するすべての関数を最初に定義する必要があります。したがって、あなたの場合、最初に関数プロトタイプを定義し、後でそれらすべてを実装することをお勧めします。これが私が意味することです:

void output(char c[], int x);
void output(char c[], int x, int y);

void output(char c[])
{
    output(c, 0);
}

void output(char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
}

void output(char c[], int x, int y)
{
    std::cout << c;
}

int main()
{
    output("myname");
    output("myname", 3);
    output("myname", 2, 4);
}
于 2012-08-19T20:58:06.223 に答える
0

C++ では、呼び出すすべての関数を最初に宣言する必要があります。コードのどこかで関数の宣言 (つまり、プロトタイプ) をコンパイラが認識していなければ、関数を呼び出すことはできません。

したがって、機能させるには、関数を呼び出す前に、まずすべての関数を宣言する (つまり、すべてのプロトタイプを配置する) 必要があります。

// Declarations go first
void output(char [], int);
void output(char [], int, int);

void output(char c[])
{
    output(c, 0);
}

void output(char c[], int x)
{
    int l = strlen(c) - x;
    output(c, x, l);
}

void output(char c[], int x, int y)
{
    cout << c;
}

そうすれば、関数を呼び出す前に、コンパイラは必要なすべてのプロトタイプを取得します。

于 2012-08-19T21:04:20.703 に答える