C++枚举++运算符重载出现LNK2019未解析外部符号错误求助
解决LNK2019未解析外部符号问题:inline运算符重载的定义问题
你的LNK2019错误根源在于inline函数的编译特性:inline函数要求在每个调用它的编译单元(比如包含main的.cpp文件)中都存在完整的定义,否则链接器无法找到对应的实现代码。
看你的代码:你在AllHeader.h中声明了inline days operator++(days d);,但把函数定义放在了day_enum.cpp文件里。当main所在的编译单元包含头文件时,只能看到inline函数的声明,看不到具体实现,编译器不会为该函数生成代码,链接阶段就会出现未解析符号的错误。
两种解决方案:
方案1:将inline函数定义移到头文件
修改AllHeader.h,把operator++的定义直接放在头文件中,替换原来的声明:#pragma once #ifndef AllHeader #define AllHeader #include <ostream> using namespace std; typedef enum days { SUN, MON, TUE, WED, THUS, FRI, SAT } days; inline days operator++(days d) { return static_cast<days>((static_cast<int>(d) + 1) % 7); } ostream& operator<<(ostream& out, const days& d); #endif同时删除
day_enum.cpp中operator++的定义,只保留operator<<的实现。方案2:移除operator++的inline关键字
如果不想把定义放在头文件,可将该函数改为普通非inline函数:- 修改
AllHeader.h中的声明:days operator++(days d); // 去掉inline - 修改
day_enum.cpp中的定义:days operator++(days d) // 去掉inline { return static_cast<days>((static_cast<int>(d) + 1) % 7); }
确保
day_enum.cpp被正确添加到项目并参与编译链接。- 修改
额外代码问题修正
你的ostream& operator<<实现存在未定义行为:return out仅在default分支执行,其他case分支执行完后没有返回语句。需将return语句移到switch外部:
ostream& operator<<(ostream& out, const days& d) { switch (d) { case SUN: out << "SUN"; break; case MON: out << "MON"; break; case TUE: out << "TUES"; break; case WED: out << "WED"; break; case THUS: out << "THUS"; break; case FRI: out << "FRI"; break; case SAT: out << "SAT"; break; default: break; } return out; // 统一返回语句 }
内容的提问来源于stack exchange,提问作者Sangita Paul
相关产品推荐
相关产品推荐

