2016-10-07 13 views
1

QtプロジェクトのuiフォームにQLabelを追加し、テキストの配置をカスタム値に設定しました。 UIクラスは、MSVCでコンパイルエラーが発生し:Qtプロジェクトでビット単位の演算子が壊れていた

ui_projectwidget.h:109:
error: C2664: 'void QLabel::setAlignment(Qt::Alignment)' : cannot convert argument 1 from 'int' to 'Qt::Alignment'

Qt::Alignmentは左/右/中央/などを示すフラグです。テキストの正当化。 ui_projectwidget.hで問題のある行は次のとおりです。このプロジェクトで

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

、私はQtのコンポーネントとは無関係です、スコープの列挙、MIBC::ItemTypeためoperator |をオーバーロード:

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)); 
} 

私は修正することができました

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

私はトンを「固定」したにも関わらず:Qtの:: AlignmentFlagためoperator |のための別のオーバーロードを追加することにより、コンパイラエラー彼は問題、私はまだそれを理解していない。デフォルトのoperator |を破棄し、Qt::AlignmentFlagを受け入れないようにしましたか?スコープされた列挙型を他のビット演算子や演算子に干渉しないように再構成すべきですか?

+1

"QFlagsクラスは、enum値のOR組み合わせを型保証する方法を提供します。詳細は..." source:http://doc.qt.io/qt-4.8/qflags.htmlサンプルと問題はあなたの問題と非常によく似ています。 –

+1

完全なプログラムがなければ、伝えるのは難しいです。しかし、あなたの定義がQtの '演算子|'(グローバル名前空間にある)を隠すスコープにいるようです。 Qtでは、必要に応じて、より簡単に独自のフラグコンビネータを定義するのに役立ついくつかのマクロを提供しています。 –

+0

@RichardCritten私は約20,000行のコードがすぐに 'QFlags'を発見したことを望みました。 – Carlton

答えて

1

ほとんどの場合、グローバル名前空間の演算子はargument dependent lookupに違反しています。その代わりに、引数の名前空間に入れ、ADLにそれを拾うようにしてください。

+0

はい、カスタムオーバーロードをグローバル名前空間に移動することもできます。私は私の元の質問がこの時点で回収可能であるとは思わない。私の問題は本当にQtやスコープ付きのenumとはまったく関係がありませんでした。私はこの問題に具体的に取り組んでいるSOの質問を見つけることができないようですので、私は新しい質問を再投稿するかもしれません。 – Carlton

関連する問題