在函数周围传递char []

时间:2012-08-19 20:50:25

标签: c++

我正在尝试将一些重载函数链接在一起。这应该是非常简单但我会收到错误。这是代码:

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 &)'

对我做错了什么的解释也会很好。

3 个答案:

答案 0 :(得分: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[]

答案 1 :(得分: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);
}

答案 2 :(得分: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;
}

这样,编译器将在调用函数之前获得所有需要的原型。