我目前定义了一个多次重载的函数。对于某些重载定义,它会使用不同类型的输入调用相同的函数。因此,函数 Foo 被定义为采用类型 A,但在函数体内,它调用类型 B 上的 Foo。但是,类型 B 上的 Foo 在定义 A 之后定义。
我目前在编译时遇到错误,我认为这是由于重载定义的顺序造成的。我没有明确的错误信息或调试工具,所以我想知道上面的场景是否确实会导致错误。
void Foo (A input) {
B b = B();
Foo(b);
}
void Foo (B input) {
printf("%s", input.toString());
}
int main() {
A a = A();
Foo(a);
return 0;
}
//code has been oversimplified
我认为这个问题可以归结为“编译器是只检查函数是否已定义,还是检查函数是否已在特定输入上定义?”
最佳答案
重载的声明顺序无关紧要,因为以下是等价的:
// 1.
void foo(int);
void foo(double);
foo(42);
// 2.
void foo(double);
void foo(int);
foo(42);
重载的声明顺序在以下不等价的意义上很重要:
// 3.
void foo(int);
foo(42);
void foo(double);
// 4.
void foo(double);
foo(42);
void foo(int);
简而言之:只有在函数调用之前声明的函数才会参与重载决策。
在您的示例程序中,Foo(A)
要么具有无限递归(如果 B
隐式转换为 A
),要么程序有问题-形成,因为您在调用之前没有声明 Foo(B)
。
Does the compiler only check whether function has been defined
一般来说,编译器根本不去检查一个函数是否已经被定义。但是,函数必须在调用之前声明。
关于c++ - 重载函数声明的顺序在 C++ 中重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979566/