問題タブ [enum-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 範囲指定された列挙型とフォーマット文字列の不一致を警告する GCC は正しいですか?
varargs コンテキストでスコープ付き列挙型を使用する場合、「列挙型クラス値を varargs 関数の引数として使用できますか?」で回答されているように、基になる型として渡されるように定義されています。スコープ付き列挙型は、スコープなし列挙型のように暗黙的に変換されます。
このプログラムを考えてみましょう:
コンパイラ (g++
バージョン 6.3.0) は、 a の最初の出力に満足していますが、 aFoo
を渡すと不平を言いBar
ます:
g++
バージョン 4.8.2 ではこれについて不満はありませんでしたが、g++
6.3.0 では問題がありました (それが今私が懸念している理由です)。%f
orを使用するなどの実質的な不一致がある場合、または基になる型を使用する%s
ように変更した場合、両方のバージョンが最初の印刷について文句を言います。それが私が有効にする理由です。Foo
long
-Wformat
警告は標準準拠の問題ではないことを理解しており、これらに対処するためにコードを変更する方法を知っています (たとえば、How can I output the value of an enum class in C++11?への回答で関数を使用します)。また、誤検知が発生する場合、警告は役に立たないと思います。列挙型の基になる型がフォーマット文字列の対応する変換仕様と一致する場合、スコープ付き列挙型をフォーマットされた I/O 関数に渡すと、実際に害が及ぶ可能性はありますか?
c++ - std::map の方法?
列挙型クラスと std::string を使用して std::map を試みていますが、エラーが発生しています。-std=c++0x で gcc 4.4.7 を使用しています (これは修正済みです)
.h ファイル:
.cpp ファイル:
状態遷移を許可するメソッドは次のようになります。
コンパイル時に、次のエラーが発生します: エラー: タイプ 'state_t' および 'state_t' のオペランドがバイナリ 'operator<' に対して無効です
に変更enum class state_t
するenum state_t
と動作します。列挙型クラスを使用してマップで見つける方法はありますか?
前もって感謝します。
c++11 - 名前空間とクラスで bitmask_operators.hpp を使用する方法
C++11 をビットフィールドとして使用し、ここでenum class
適切なアプローチを見つけたいと考えています。
しかし、列挙型クラス宣言がグローバル名前空間ではなく、カスタム名前空間またはクラス内にある場合、私は立ち往生しました。例えば:
これは常に私にエラーを与えます:
テンプレートの特殊化を、テンプレートが配置されているのと同じ名前空間enable_bitmask_operators
(bitmask_operators.hpp
この場合はグローバル名前空間) に配置するまで。
しかし、特殊化を enum クラス宣言の近くに置きたいと思っています。
言及された記事では、この問題は Jay Miller によってもコメントされており、彼は解決策を提供しているようです。しかし、私は でこれを解決するための彼のヒントに従わなかったbitmask_operators.hpp
.
サンプルコードはこちら。
編集/部分的に解決しました:その間、私はそれを機能させました(ダンプのコピーと貼り付けの問題と不可解なエラーメッセージだけです;-)。Jay Millers の constexpr 関数ソリューションを適用して、サンプル コードを更新しました。
ただし、クラス内で列挙型クラスを宣言する場合は、まだ問題があります。クラスに ctor を追加すると、次のように問題が発生します。
次に、エラーが発生しました:
さて、static
キーワードを追加してこれを修正しました:
しかし、ビットマスク演算子を使用しようとすると、次の問題が発生します。
エラーが発生しました:
エラーがここにあることを示す更新された例。
c++ - 列挙型クラスの範囲外の値
enum class
関数内でを定義すると、使用可能なオプションから値が取得されます。ただし、クラス内で定義すると、オプションの値はありません。では、 の初期値はg.f
? true
比較すると何が返されますか?((g.f==??)==true)
?