遍历unordered_map时遇编译错误:a function-definition is not allowed here before ‘:’ token
问题分析与代码修正
错误原因解析
报错信息翻译:此处不允许函数定义,‘:’ 标记前存在语法错误。核心问题是你的代码没有包裹在函数(比如main())内部——C++规定所有可执行语句(循环、变量赋值等)必须放在函数作用域内,不能直接写在全局区域。除此之外代码还有其他语法和逻辑问题:
- 范围for循环(
for(auto &it: freq_map))需要开启C++11及以上编译标准 while(expr != '\0')逻辑错误:expr是指针,这里比较的是指针地址和字符'\0'的ASCII值,应该判断指针指向的内容*expr != '\0'- 输出语句多了一个多余的右括号:
std::cout<<it.first<<"\t"<<it.second);
修正后的代码
#include <iostream> #include <unordered_map> // C++11及以上无需tr1,直接使用标准库容器 using namespace std; int main() { // 假设bufin是已定义并初始化的char*类型变量 unsigned char *expr = (unsigned char *)bufin; unordered_map<char, int> freq_map; // 修正循环条件:判断指针指向的内容是否为字符串结束符 while(*expr != '\0') { char ch = *expr; freq_map[ch]++; expr++; } // 遍历unordered_map并输出键值对 for(auto &pair : freq_map) { std::cout << pair.first << "\t" << pair.second << std::endl; } return 0; }
额外注意事项
- 若编译器版本较旧,仍需依赖
tr1库,则保留#include <tr1/unordered_map>和using namespace std::tr1;,同时编译时需添加C++11标准参数(例如GCC编译器加-std=c++11) - 确保
bufin指向的是一个以'\0'结尾的合法字符串,否则会导致内存越界访问
内容的提问来源于stack exchange,提问作者Himanshu Dutta
相关产品推荐
相关产品推荐

