运行VC 6.0 C++代码时出现C2146语法错误该如何解决
错误原因分析
- 类内成员函数重复声明触发VC6语法解析bug:你在Solution类的public域中先对
combinationSum做了一次无函数体的前置声明,紧接着又写了带函数体的定义,VC6作为已停止维护20多年的老旧编译器,语法解析逻辑无法兼容这种写法,是触发C2146语法报错的直接原因。 - 调用
combinationSum时参数类型不匹配:该函数的第一个形参是vector<int>&引用类型,你调用时传的&aa是vector<int>*指针类型,类型不匹配。 - 使用了VC6不支持的C11语法:你用
[1,2,3,4,5]、[[]]这种初始化列表初始化vector的写法是C11标准才引入的特性,VC6发布时C++11还未制定,完全不支持该语法。 - 基础拼写&语法错误:标准输出对象名是
cout,你误写为court;另外C++标准库没有重载<<运算符支持直接输出vector<vector<int>>类型的变量,无法直接打印。 - 成员函数调用顺序问题:
combinationSum中调用了combinationSumDFS,但后者的定义写在前者之后,VC6的类成员解析逻辑可能无法识别,需要调整顺序提前声明。
修复方案
按照如下步骤修改代码即可正常编译运行:
- 删除
combinationSum多余的前置声明,仅保留带函数体的定义,同时将combinationSumDFS的声明移到combinationSum之前。 - 替换C++11初始化列表,改用
push_back方法逐个插入元素初始化vector。 - 调用
combinationSum时直接传aa,不要取地址,匹配引用类型形参。 - 修正
cout拼写错误,新增循环逻辑遍历二维vector打印结果。
修复后完整代码
#include <iostream> #include <vector> #include <windows.h> using namespace std; int main() { class Solution { public: // 提前声明DFS函数 void combinationSumDFS(vector<int>& candidates, int target, int start, vector<int>& out, vector<vector<int> >& res); // 删掉多余前置声明,直接写定义 vector<vector<int> > combinationSum(vector<int>& candidates, int target) { vector<vector<int> > res; vector<int> out; combinationSumDFS(candidates, target, 0, out, res); return res; } void combinationSumDFS(vector<int>& candidates, int target, int start, vector<int>& out, vector<vector<int> >& res) { if (target < 0) return; if (target == 0) { res.push_back(out); return; } for (int i = start; i < candidates.size(); ++i) { out.push_back(candidates[i]); combinationSumDFS(candidates, target - candidates[i], i, out, res); out.pop_back(); } } } yoyo; // 替换C++11初始化列表 vector<int> aa; aa.push_back(1); aa.push_back(2); aa.push_back(3); aa.push_back(4); aa.push_back(5); vector<vector<int> > restl; // 修正参数,不传地址 restl = yoyo.combinationSum(aa, 3); // 修正cout拼写,新增遍历打印逻辑 for(int i=0; i<restl.size(); i++){ cout << "组合" << i+1 << ": "; for(int j=0; j<restl[i].size(); j++){ cout << restl[i][j] << " "; } cout << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Existence
相关产品推荐
相关产品推荐

