問題タブ [static-assert]
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++ - テンプレート関数がどこにも呼び出されていないにもかかわらず、static_assert がコンパイルに失敗する
g++ 4.6.3 (現在、ubuntu 12.04 のデフォルト パッケージ) をフラグ c++0x と共に使用していますが、これに出くわしました:
コンパイルエラーで:
この関数はまだどこにも呼び出していませんが。
それはg ++のバグですか?この関数は、コードのどこかで呼び出された場合にのみインスタンス化されるべきではありません。
c++ - C++11 メソッド アクセス レベルを静的にテストする方法はありますか?
C++11 では、型特性を静的にテストできる、つまりコンパイル時に問題を検出できる、新しいクラス テンプレートが多数追加されています。クラスのテストを書いていますが、特定のメソッドが公開されていることを確認する必要があります。
「動的な」解決策は、オブジェクトを作成してメソッドを呼び出すことです。それが機能しない場合、コンパイラは文句を言います。ただし、別の種類のエラーが発生する可能性があり、結果として生じるエラー メッセージがよりわかりにくくなります。可能であれば、静的アサーションを使用してメソッド アクセス レベルをテストすることをお勧めします。
それは可能ですか、それとも本当にそのためのオブジェクトを作成する必要がありますか?
(また、メソッドを非公開/保護する必要がある場合はどうすればよいですか)
c++ - 同じポインタがマクロに渡されるかどうかを判断します
デバッグ、ロギング、スタックトレース表示などのマクロのセットがあります。そのうちの1つは次のようなものです。
これは、私が書いたマクロの単純化されたバージョンを超えています。アサーション(ランタイム)が失敗した場合、カスタムアサーションダイアログボックスがあり、そのようなnullチェックの失敗をログファイルに記録します。マクロは、コンパイル時に非ポインターがチェックされるようにも記述されています(静的アサート)。
ここで、2つのポインターが実際に同じであるかどうかを確認するための静的アサートを探しています。例:
マクロへの両方の引数が同じであるため、コンパイラエラーが発生するはずです。ポインタが同じメモリを指しているかどうかは関係ありません(それはランタイムであるため)。
私は次のような表現を試しました:
それらのどれもゼロ除算コンパイラエラーを与えません。void*
また、私はテンプレート引数を取るテンプレートで試しました:
ただし、ローカル変数ポインターをテンプレートの非型引数に渡すことはできません。
キーワードをサポートしていないVC9を使用しconstexpr
ています(VS2012でもサポートしていません)。代わりに「const」を使用してみましたが、エラーは発生しません。また、式を配列サイズとして使用しましたが、これは常にエラーになります。
c++ - コピー不可能なオブジェクトを含むオブジェクトのコンパイル警告は読み取り不能です
以前も似たような質問をしたことがありますが、今回はもっと具体的にしたいと思います。私が直面している問題は、コピー不可能なオブジェクトを含むオブジェクトがあり、誰かが私のインターフェイスを使用したいのに、それをうまく使用しない場合 (オブジェクトのコピー コンストラクターを使用しようとする場合)、コンパイル エラーが発生することです。彼の実際のコードではなく、オブジェクトに。2 つの質問: 1. 元のコード行を指すように修正できますか? 2.できない場合、誰かが実際にコピーc'torを使用しようとした場合にのみ発生するstatic_assertを配置するにはどうすればよいですか(いくつか試しましたが、誰かが使用していなくても取得できます... )
理解できなかった場合に備えて、サンプル コードとコンパイル エラーを追加しています... 最後のコンパイル エラーが ObjectHolder h を指していることに注意してください。ファイル..メインを指すようにしたいのですが、ありがとうございます!
*名前を置き換えたときの間違いでした..実際には、コンパイル エラーを作成したコードです。そして、障害をコピーに転送するためだけにプライベートコピーc'torを実装したくないと仮定しましょう
c++ - /boost/lockfree/queue.hpp: エラー: 静的アサーションに失敗しました: (boost::has_trivial_destructor::価値)
このファイルでboost::lockfree::queue
代用しようとしていますhttps://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppstd::queue
追加しました#include <boost/lockfree/queue.hpp>
; 行130
, std::queue<action> m_actions;
, を に変更しましたboost::lockfree::queue<action> m_actions;
。ロックに関係するすべての行を削除しました。行103
を 、m_actions.pop();
、 に変更しましたm_actions.pop(a);
。
scons broadcast_server_lockfree
プロジェクトルートに追加broadcast_server_lockfree = SConscript('#/broadcast_server_lockfree/SConscript',variant_dir = builddir + 'broadcast_server_lockfree',duplicate = 0)
し、ディレクトリでSConstruct
を使用した後、プロジェクトルートにいると、これらのエラーが発生しbroadcast_server
ます。SConstruct
broadcast_server_lockfree
私は C++ についてほとんど何も知りませんが、エラーを検索しても何も得られませんでした (何を読んでいるのかわからないため)。
boost::lockfree::queue
これが役立つ場合 の例です。http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html
これを修正する方法を教えてください。
action
c++ - コンパイル時の静的フィールド ポインターの比較
クラス A から派生したクラス B があります。A は静的フィールド f を宣言し、B は同じ名前の同様のフィールドを宣言する場合があります。以下は機能しません。
理論的にはこれらのアサーションはコンパイル時にチェックできますが、定数式はアドレスを取ることができないため、許可されません。
この種のチェックをコンパイル時に機能させる方法はありますか?
c++ - static_assert() を使用して、(コンパイラよりも) コンパイル時のエラーを改善する
昨日、次の例のように、非オブジェクトconst
からメンバー関数を呼び出すことによって引き起こされるコンパイル時エラーを理解するのに何年もかかりました:const
clang のエラー メッセージは数行あり、難解すぎました ( については触れていませんconst
) が、gcc はより適切なエラーを表示しました (さらに多くの行がありましたが、最終的には cv 修飾子を無視していると不平を言いました)。
したがって、将来このようなことを避けるためstatic_assert()
に、ユーティリティヘッダーで使用することを考えました。私の素朴なアプローチ
void add_child() const
テンプレートが呼び出されない場合でも、コンパイラはすぐにエラーをトリガーするため、失敗します。他にどうすればこれを機能させることができますか?
c++ - 静的アサーションと SFINAE
このことを考慮:
明らかにヘッダーが欠落していることは別として、これはコンパイルする必要がありますか?
言い換えれば、オーバーロードされた関数テンプレートの戻り値を推測している間に後続の decltype 内でトリガーされる静的アサーションの失敗がコンパイルを停止するように要求されているのか、それともオーバーロードを単に破棄する必要があるのか を尋ねています。
gcc 4.7 では、コンパイルが失敗します。これがgcc 4.8で問題なくコンパイルされることはかなり確信しています(ただし、現時点では確認できません)。誰が正しいですか?