![](/img/trans.png)
[英]Does an overloaded bitwise-or operator ('|') have a well-defined evaluation-order?
[英]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.