编写伪Brainfuck编译器时vector.insert调用报错,求排查问题
伪Brainfuck编译器中vector.insert()报错问题
我正在用C++编写一个伪Brainfuck编译器,但vector.insert()方法无法正常工作,编译器给出如下错误:
no instance of overloaded function matches the argument list
argument types are: (int, char)
object type is: std::vector<char, std::allocator>
以下是我的代码:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <tuple> #include <iterator> int main() { std::vector<char> Array = { '\0' }; std::vector<std::tuple <int, int> > loop_starts = { }; unsigned int ptr = 0; std::ifstream file("BrainfuckCode.txt"); std::vector<std::string> Code = { }; int i = 0; std::string Line; while (true) { i++; getline(file, Line); if (Line == "\0") { break; } else { Code.push_back(Line); } } for (int i = 0; i < Code.size(); i++) { for (int j = 0; j < Code[i].size(); j++) { switch (Code[i][j]) { case '+': Array[ptr]++; break; case '-': Array[ptr]--; break; case '>': if (ptr == Array.size() - 1) Array.push_back('\0'); ptr++; break; case '<': if (ptr == 0) Array.insert(0, '\0'); else ptr--; break; case '.': putchar(Array[ptr]); break; case ',': Array[ptr] = getchar(); break; case '[': loop_starts.push_back(std::make_tuple(i, j)); break; case ']': if ((int)Array[ptr] != 0) { i = std::get<0>(loop_starts[loop_starts.size() - 1]); j = std::get<1>(loop_starts[loop_starts.size() - 1]); } break; } } } }
问题分析与修复
核心错误原因
std::vector::insert()没有接受(int, char)的重载版本。你传入的第一个参数是整数索引0,但该方法要求第一个参数是迭代器,用来指定插入位置,而非直接的索引值。
直接修复代码
将<分支里的Array.insert(0, '\0')修改为:
Array.insert(Array.begin(), '\0');
Array.begin()返回指向容器第一个元素的迭代器,完全符合insert的参数要求。
其他潜在问题修复
文件读取逻辑错误
当前循环通过判断Line == "\0"终止,这不符合文件读取的逻辑——getline读到文件末尾时不会返回空字符串"\0",会导致死循环。建议修改为:std::string Line; while (getline(file, Line)) { Code.push_back(Line); }利用
getline的返回值直接判断是否读取到文件末尾。循环跳转逻辑隐患
处理]时直接修改外层循环的i和j,会和for循环的自增逻辑冲突,导致代码重复处理或跳过部分指令。建议改用while循环重构外层遍历逻辑,或者调整索引的处理方式,避免循环变量被外部篡改。
内容的提问来源于stack exchange,提问作者MadScientistVictor
相关产品推荐
相关产品推荐

