c++ - 重载函数声明的顺序在 C++ 中重要吗?

标签 c++ function overloading declaration

我目前定义了一个多次重载的函数。对于某些重载定义,它会使用不同类型的输入调用相同的函数。因此,函数 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/

相关文章:

c++ - 我怎么知道一个项目是不是MFC应用程序

python-3.x - 无法理解此递归函数的分配和环境用法

c++ - "error: ' A ' cannot be overloaded",但代码中没有任何重载

c++ - Unicode 支持的 isdigit 和 isspace 函数

c++ - 计算函数在 C++ 中花费多长时间的最佳方法是什么?

C++:在被本地字符串捕获后释放或销毁 malloc 的 char *?

python - 将参数传递给 pandas.DataFrame.transform 中的函数

c - 使用不同数量的参数调用和定义函数

c# - 有没有更简单的方法为 C# 中的方法创建重载?

C++ 语义类型包装