簡體   English   中英

Qt 項目中損壞的按位或運算符

[英]Broken bitwise-or operator in a Qt project

我最近剛剛在一個Qt項目中的ui表單中添加了一個QLabel,將其文本對齊方式設置為自定義值,然后驚訝地發現ui類的自動生成代碼導致MSVC中的編譯器錯誤:

ui_projectwidget.h:109:
錯誤:C2664:“void QLabel::setAlignment(Qt::Alignment)”:無法將參數 1 從“int”轉換為“Qt::Alignment”

Qt::Alignment是指示左/右/中心/等的標志。 文本對齊。 ui_projectwidget.h 中的違規行是:

componentName->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);

在這個項目中,我重載了operator | 對於與 Qt 組件無關的作用域枚舉MIBC::ItemType

using FlagType = int64_t;
enum class ItemType: FlagType {
      type1, type2, etc
}

using Ty = std::underlying_type_t<MIBC::ItemType>;

inline MIBC::ItemType operator| (MIBC::ItemType lhs, MIBC::ItemType rhs) {
    return static_cast<MIBC::ItemType>(static_cast<Ty>(lhs) | static_cast<Ty>(rhs));
}

我能夠通過為operator |添加另一個重載來修復編譯器錯誤operator | 對於 Qt::AlignmentFlag:

inline Qt::AlignmentFlag operator|(Qt::AlignmentFlag lhs, Qt::AlignmentFlag rhs) {
    return static_cast<Qt::AlignmentFlag>(static_cast<int>(lhs) | static_cast<int>(rhs));
}

即使我已經“修復”了這個問題,我仍然不明白。 是什么打破了默認operator | 以至於它不再接受Qt::AlignmentFlag 我應該以不干擾其他按位或運算符的方式重構我的作用域枚舉嗎?

最有可能的是,您在全局命名空間中聲明了運算符,從而破壞了參數相關的 lookup 相反,您應該將它放在其參數的命名空間中,並讓 ADL 選取它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM