C++类成员定义含9个空set的vector报错原因及解决咨询
问题解答:类成员vector初始化报错的原因及解决方法
你遇到的这个编译错误,核心原因是在C++类的成员变量声明中,不能直接使用圆括号()的语法来初始化非静态成员。
咱们来拆解一下为什么报错:
当你写vector<set<int> > rowset(9,set<int>());时,编译器不会把它当成成员变量的初始化,反而会把它解析成一个函数声明——它会认为你在声明一个名为rowset的成员函数,这个函数返回vector<set<int>>类型,并且接受两个参数:第一个是数字9(但数字不能作为参数的标识符,这就触发了expected identifier before numeric constant的错误),第二个是一个临时的set<int>对象。这完全不是你想要的初始化行为!
那怎么正确实现“直接初始化9个空set的vector”呢?有两种常用方案:
方案1:使用C++11及以后的统一初始化语法(花括号{})
这是最简洁的方式,直接在成员声明时用花括号完成初始化:
class X{ vector<set<int> > rowset{9, set<int>()}; };
甚至可以更简化——因为vector的单参数构造函数(传入整数n)本来就是创建n个默认构造的元素,而set<int>默认构造就是空集合,所以写成下面这样效果完全一样:
class X{ vector<set<int> > rowset{9}; };
方案2:在构造函数的初始化列表中初始化(兼容C++11之前的版本)
如果你需要兼容老版本C++标准,就把初始化逻辑放到类的构造函数里:
class X{ public: // 在构造函数初始化列表中完成vector的初始化 X() : rowset(9, set<int>()) {} private: vector<set<int> > rowset; };
这样就能直接得到包含9个空set<int>的vector,不需要后续调用push_back啦。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

