成员函数内调用同名重载函数失败,编译报错问题咨询
问题分析与解决
你遇到的这个编译错误不是因为函数重载在成员函数里不生效,而是C++的作用域查找规则导致的——编译器在成员函数内部查找名字时,会优先在当前类的作用域里找,只有找不到的时候才会去全局作用域找。
具体到你的代码:
在test::print()里调用print(i)时,编译器首先会在test类的作用域里找print这个名字,而你的test类里只有无参的void print();,没有接受int参数的版本,所以它就直接报错找不到匹配的函数了,根本没去全局作用域找那个void print(int n);。
解决方法
这里有几种简单的修复方式:
1. 明确指定全局作用域(最直接的方法)
在调用全局函数时,加上全局作用域解析符::,告诉编译器直接去全局作用域找这个函数:
void test::print() { for(int i=1; i<10; i++) ::print(i); // 加::指定全局print }
2. 在成员函数内声明全局函数的存在
如果你不想每次都写::,可以在test::print()内部声明一下全局的print函数,让编译器知道这个名字在全局作用域有对应的版本:
void test::print() { extern void print(int); // 声明全局print函数 for(int i=1; i<10; i++) print(i); }
3. 避免同名(最彻底的规避方式)
如果场景允许,直接把全局函数的名字改成和成员函数不同的,比如printInt,这样就不会有作用域查找的冲突了:
void printInt(int n){ cout << n; } void test::print() { for(int i=1; i<10; i++) printInt(i); }
修改后的完整代码示例(用方法1)
#include<iostream> using namespace std; class test{ public: void print(); }; void print(int n); int main(){ test t; t.print(); return 0; } void test::print() { for(int i=1; i<10; i++) ::print(i); // 这里加了:: } void print(int n){ cout << n; }
内容的提问来源于stack exchange,提问作者CodePurin
相关产品推荐
相关产品推荐

