我正在尝试将一些重载函数链接在一起。这应该是非常简单但我会收到错误。这是代码:
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 &)'
对我做错了什么的解释也会很好。
答案 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;
}
这样,编译器将在调用函数之前获得所有需要的原型。