C++ []运算符重载未知错误排查求助
解决你的枚举+Map/Set的运算符重载问题
我帮你梳理下代码里的几个关键问题,都是很容易踩的语法和逻辑坑,咱们一个个来解决:
1. 私有成员setMap的定义不完整
你代码里的private: map&l...明显是输入截断了,正确的定义应该是**map<name, set<string>> setMap;**——因为你的map是用枚举name作为键,set<string>作为值的,必须明确指定模板参数才能通过编译。
2. operator[]的返回值类型不匹配
你的重载函数声明返回set<string>,但setMap.find(n)返回的是map的常量迭代器(因为成员函数标记了const),不是直接的set<string>对象。正确的做法是先判断迭代器是否指向有效元素,再返回对应的值:
- 如果找到元素,返回
it->second(迭代器指向的pair的第二个元素就是对应的set<string>) - 如果没找到,要么返回空的
set<string>,要么抛出异常,根据你的业务需求选择。
3. 析构函数的问题
你声明了~SetTable();但没有定义,这会导致链接错误。如果你的类不需要自定义析构逻辑,直接用默认析构函数就行:~SetTable() = default;
修正后的完整代码
#include <map> #include <set> #include <string> #include <stdexcept> // 如果要抛异常需要这个头文件 using namespace std; class SetTable { public: enum name { a }; SetTable() { setMap[a] = { "foo" }; } // 使用默认析构函数,避免链接错误 ~SetTable() = default; set<string> operator [] (const name & n) const { auto it = setMap.find(n); // 找到目标元素则返回对应的set if (it != setMap.end()) { return it->second; } // 没找到的情况:可以返回空set,或者抛异常 return {}; // 若要抛异常,替换为下面一行: // throw invalid_argument("指定的枚举值不在SetTable中"); } private: // 完整的map模板定义 map<name, set<string>> setMap; };
额外说明
如果你希望operator[]能像标准库map那样,当键不存在时自动插入默认构造的set<string>,那你不能把成员函数声明为const(因为插入操作会修改setMap)。这种场景下的重载写法会是:
set<string>& operator [] (const name & n) { return setMap[n]; // 标准库map的[]运算符会自动插入默认值 }
不过这取决于你的业务需求——我是按照你原代码里const成员函数的只读场景来修复的。
内容的提问来源于stack exchange,提问作者mcdito13
相关产品推荐
相关产品推荐

