C++ 类成员变量声明语法错误

类成员变量声明语法错误

一个禁止了默认构造函数,只有一个带参构造函数的一个类,那么才其他类中使用该类的对象时使用化,需要注意:

C++11 前,类内初始化只允许 = value 语法;

C++11 后引入 花括号初始化圆括号初始化 ,但圆括号 在某些场景下会与函数声明 产生歧义,因此在类成员初始化中推荐使用花括号 {}

在qt5.11中就遇到了如下的错误

错误使用:

cpp 复制代码
struct SyncQueue {
public:
    SyncQueue(size_t capacity) : capacity(capacity), abort_flag(false) {}
    SyncQueue() = delete;
    SyncQueue(const SyncQueue<T>&) = delete;
    SyncQueue& operator=(const SyncQueue<T>&) = delete;
    ~SyncQueue() {}
	/*
		若干待实现的函数
	*/

}

class SomeClass {
    // ❌ 非法语法:看起来像函数调用,但在这里不允许
    SyncQueue<int> sq(1000);
};

解决方法:

法一:

cpp 复制代码
class MainWindow : public QMainWindow {
    // ...
private:
    Ui::MainWindow *ui;
    SyncQueue<int> sq{1000};  // ✅ 使用花括号
};

法二:

.h源文件中声明

cpp 复制代码
class MainWindow : public QMainWindow {
    // ...
private:
    Ui::MainWindow *ui;
    SyncQueue<int> sq;  // ✅ 仅声明
};

.cpp中初始化

cpp 复制代码
MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent)
    , sq(1000)  // ✅ 在初始化列表中构造
{
    ui->setupUi(this);
}
相关推荐
华仔啊21 小时前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing1 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide2 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
端平入洛2 天前
auto有时不auto
c++
IT探险家2 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺2 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602732 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端
桦说编程2 天前
实战分析 ConcurrentHashMap.computeIfAbsent 的锁冲突问题
java·后端·性能优化