g++编译以std::string[5]为std::map值类型的代码报错如何解决
问题原因
- 成员函数未实现:你在类中声明了
get_key()、get_text()两个成员函数,没有提供对应的实现,链接阶段会抛出未定义引用错误。 - 非法的map值类型:C++标准不允许将原生数组作为
std::map的值类型,原生数组不支持复制、赋值等容器要求的语义,你定义的using key_map = std::map<char, std::string[5]>;不符合语法要求,编译阶段就会报错。 - 数组越界访问:
encrypt函数中你对长度为5的key_letter_arr数组使用下标5赋值,数组合法下标范围为0~4,该操作属于越界访问,是未定义行为。 - 赋值逻辑缺失:
encrypt函数的内层循环中,仅在else分支对数组元素赋值,if分支没有任何赋值操作,会导致数组部分元素为空值;同时赋值操作写死了下标,没有对应循环变量,逻辑完全错误。 - 缺少必要头文件:你使用了
rand()函数但未引入<cstdlib>头文件,部分编译器会报函数未定义的错误。
解决方法
- 补充未实现的成员函数,代码如下:
std::string Cryptographer::get_key() { return crypted_text.generated_key; } std::string Cryptographer::get_text() { return crypted_text.encrypted_text; }
- 替换map的value类型为支持容器语义的
std::array,首先引入<array>头文件,再修改别名定义:
#include <array> using key_map = std::map<char, std::array<std::string, 5>>;
对应的key_letter_arr变量定义修改为:
std::array<std::string, 5> key_letter_arr;
- 修正越界和赋值逻辑错误,将原本的
key_letter_arr[5] = ...修改为对应循环下标的赋值,同时补全if分支的逻辑:
for (int index=0; index < 5; index++){ if (memory_number + n_factor > 91) { memory_number = 65; } key_letter_arr[index] = std::string(1, char (memory_number + n_factor)); memory_number += n_factor; }
- 补充缺少的头文件
<cstdlib>,如果需要更高质量的随机数,可以替换为C++11标准的<random>库实现。 - 可按需优化遍历逻辑:当前通过遍历map匹配下标的实现效率极低,可以直接将生成的密钥序列存入顺序容器,避免无意义的遍历操作。
内容的提问来源于stack exchange,提问作者Ibrahim
相关产品推荐
相关产品推荐

