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 回答