問題タブ [using-declaration]
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++ - 列挙型を使用した「using」宣言
using宣言は、列挙型では機能しないようです。
動作しません!
列挙型の列挙子ごとにusing宣言を追加する必要がありますか? 以下のように:
c++ - Visual Studio 2008 での C++ の "using" 宣言
Google protobuf を使用しようとしていますが、次の例があります。
このコードを Visual Studio Express 2008 に実装しようとすると、次のエラーが発生します。
エラー C2873: 'google::protobuf': シンボルは using 宣言では使用できません
編集:「名前空間 google::protobuf; を使用する」場合 関数内では、エラーが発生しなくなりました。私が混乱しているのは、Google の例 (および "The C++ Programming Language" の Stroustrup の例) が示すように機能しないことです。
c++ - 依存する基本クラスからのタイプへのアクセス
依存する基本クラスから型名をインポートするためにusing-declarationsが機能しないように見える理由を誰かが知っていますか?これらはメンバー変数と関数に対して機能しますが、少なくともGCC 4.3では、型に対して無視されているようです。
いくつかのレベルの継承を通じて継承したいアロケータスタイルのtypedefのセットを持つ基本クラスがあります。私がこれまでに見つけた最善の解決策は上記のバージョン3ですが、なぜバージョン4が機能しないように見えるのか興味があります。GCCはusing-declarationを受け入れますが、それを無視しているようです。
C ++ Standard、C++Progを確認しました。ラング。第3版 [Stroustrup]、およびC ++テンプレート[Vandevoorde、Josuttis]ですが、using-declarationsを依存する基本クラスタイプに適用できるかどうかについては言及されていないようです。
別の例を見るのに役立つ場合は、GCCメーリングリストで質問されているが実際には回答されていない同じ質問があります。質問者は、他の場所で「typenameの使用」を見たことがあるが、GCCはそれをサポートしていないようだと示しています。私はそれをテストするために利用できる別の適合コンパイラを持っていません。
c++ - 宣言、スコープ、およびアクセス制御を使用する c++
通常、「using」宣言は、そうでなければ隠される基底クラスの一部のメンバー関数をスコープに入れるために使用されます。その観点からは、アクセス可能な情報をより便利に使用するためのメカニズムにすぎません。
ただし、'using' 宣言を使用して、アクセス制約を変更することもできます (関数だけでなく、属性に対しても)。例えば:
基本クラスへのポインターからいつでも g() と a にアクセスできるため、派生クラスでのこのアクセス制限は実際には役に立たないと思います。では、少なくとも何らかのコンパイラ警告が表示されるべきではないでしょうか? それとも、派生クラスによるアクセスの制限を禁止する方がよいのではないでしょうか? using 宣言は、アクセスに制約を追加する唯一の可能性ではありません。また、基本クラスの関数をオーバーライドして、より多くのアクセス制限を持つセクションに配置することによっても実行できます。そのような方法でアクセスを制限することが本当に必要な合理的な例はありますか? そうでない場合、なぜそれを許可する必要があるのか わかりません。
もう 1 つ: 少なくとも g++ では、同じコードは「using」という単語がなくても適切にコンパイルされます。つまり、上記の例では、C::a; と書くことができます。および C::g; C::a; を使用する代わりに C::g を使用して; 最初のものは後者の近道にすぎないのでしょうか、それとも微妙な違いがありますか?
//編集:
したがって、以下の議論と回答から、私の結論は次のようになります:
- public 継承を使用して派生クラスのアクセス制約を制限することが許可されています-
使用できる便利な例があります
- テンプレートと組み合わせて使用すると問題が発生する可能性があります (たとえば、派生クラスは、それがベースであるにもかかわらず、一部のテンプレートクラス/関数の有効なパラメーターになることはできません)
- よりクリーンな言語設計では、そのような使用を許可しないでください
- コンパイラーは少なくとも何らかの警告を発行する可能性があります
c++ - 宣言の使用 (派生クラス)
がB1::fb()
としてB1::fb(B1*)
and B2::fb()
扱われているからB2::fb(B2*)
でしょうか。つまり、暗黙のパラメーターはこれらを区別するのに役立ちますか?
$13.3.1/4-
using 宣言によって派生クラスに導入された非変換関数の場合、暗黙的なオブジェクト パラメーターの型を定義する目的で、関数は派生クラスのメンバーと見なされます。
c++ - 名前を別の名前空間に移動するために-declarationを使用していますか?
与えられた:
次の2つのバリアントの間に違いはありますか?
a)
およびb)
編集:(a)コードを複製することはかなり明らかですが、これは決して良い考えではありません。問題は、過負荷の解決などに関するものです。他の名前空間に他foo
のsまたはmunch
esがある場合はどうなりますか?
c++ - 宣言を使用する名前空間 (GCC/VS2010 のバグ)?
VS2010 - 正常にコンパイル
gcc (ideone) - 正常にコンパイルされます
Comeau - エラー ""ComeauTest.c"、10 行目: エラー: "i" は、A::i を使用して現在のスコープで既に宣言されています。"
$7.3.3/8 - 「using-declaration は宣言であるため、複数の宣言が許可されている場所 (および場所のみ) で繰り返し使用できます。」
右の例は、コードが実際に不正であることを示しています。
では、これは GCC と VS2010 のバグですか?
編集2:
using directives
手元のクエリとは無関係だったので、複数を削除します。
c++ - using宣言は、継承された仮想関数を非表示にすることになっていますか?
gccを使用した上記のコードは
しかし、iccでは
どちらが正しいですか、それとも標準で定義されていませんか?
編集:これは確かにバグがあることを証明します、次の主な機能を考慮してください
したがって、同じオブジェクトを直接使用すると異なる結果が生成され、同じタイプのポインターを介して使用すると異なる結果が生成されます!!!
c++ - メンバー関数スコープでステートメントを使用するC++
テンプレート派生クラスのテンプレート基本クラスのメンバーを使用する場合は、次のようにスコープに含める必要があります。
他のusingステートメントのように、このusingステートメントをローカルスコープに配置できないのはなぜですか?
c++ - 名前空間宣言の後にusingステートメントを宣言する
私はいくつかの「パッケージ」で構成されているユーティリティライブラリを書いています。各パッケージのクラスは、さまざまな名前空間に含まれています。クラス宣言の最後にステートメントを使用して自動的に宣言することで状況を単純化する方法についての考えがあります(以下を参照)。これにより、プログラマーがcppファイルでそれを行う必要がなくなります。
私の理解では、ユーザーがヘッダーString.hを含み、StringがUtilityにある場合、プログラマーはStringを使用したいと思うでしょう。明らかに、名前空間を汚すファイルの束を含む外部のクラスチェーンがある場合、これは悪い可能性があるので、代わりに#defineにするのはどうでしょうか。
そうすれば、この拡張機能が必要なプログラマーはそれを手に入れることができます。
これは良い考えですか、それとも私が見落としているものがありますか?