You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:39:02