C++带构造参数的类作为类/结构体成员声明编译报错求助
问题根源
你遇到的报错是C++类内成员初始化的语法限制导致的:
在类定义中直接用小括号()初始化非静态成员时,编译器会将这条语句错误解析为成员函数声明:
- 写
QuickBin m_store1(m_size);时,编译器误以为你要声明返回值为QuickBin、名为m_store1、参数为m_size类型的成员函数,自然会提示找不到m_size这个类型 - 写
QuickBin m_store2(40);时,编译器同样按函数声明解析,但函数参数列表里不允许直接写常量值,因此提示缺少右括号
而栈上定义变量的时候不存在这个解析歧义,所以QuickBin locker(40);可以正常编译。
兼容C++11的解决方案
方法1:在构造函数初始化列表中初始化成员
这是最通用的写法,不受C++版本限制:
class useless { const size_t m_size; QuickBin m_store1; QuickBin m_store2; public: useless(const size_t s) : m_size(s), m_store1(s), m_store2(40) { } };
把QuickBin类型的成员先声明,放到构造函数的初始化列表里传参数初始化即可。
方法2:使用C++11支持的类内花括号初始化
C++11开始允许类内非静态成员用花括号{}做列表初始化,避开小括号的解析歧义:
class useless { const size_t m_size; public: useless(const size_t s) : m_size(s) { } QuickBin m_store1{m_size}; QuickBin m_store2{40}; };
这种写法不需要改动构造函数代码,只要把原来的小括号换成花括号即可,完全符合C++11标准要求。
内容的提问来源于stack exchange,提问作者Logicrat
相关产品推荐
相关产品推荐

