問題タブ [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++ - 親の属性の継承と非表示
このようなことをするのは合理的ですか?
注:これは最小限の作業例です
Liskov Principleに違反するため、関数を単純に非表示にすることはできないことは承知していますが、private
継承を行ってすべてのパブリックメソッドを再度指定するのは本当に冗長に思えます。
2 つのクラスには共通の親が必要であり (それが直接の 1 つであっても)、x
直接変更できてはなりません。
using
ボーナス:誰かがこの場合の正確な動作を定義する場所を教えてもらえますか? 私はそれをグーグルで試しましたが、ほとんど成功しませんでした。
c++ - 宣言を含めて使用する
これらの2つの宣言はどういう意味ですか?
また、ディレクティブ/宣言の使用について深く説明している優れたチュートリアルはありますか?ありがとうございます。
c++ - RADStudio 2010 で「宣言の使用」が機能しない
VCL クラスから新しいクラスを派生させていTStream
ます。
TStream
Seek の次の 2 つのバリアントを宣言します。
しかし、クラスをコンパイルすると、次の W8022 警告が表示されます:-
確かに Using 宣言はそれを修正する必要がありますか?
この質問を軌道に戻すために、私は TStream::seek の 2 つのバージョンが相互に関連する方法を認識しており、派生クラスによって公開された継承された Seek(int,int) メソッドを取得しようとしています。なぜ私のusing
宣言はそれをしていないのですか?
c++ - 別の名前空間でエイリアス宣言された基本クラスコンストラクターを呼び出す
私は、C ++ 11を介してエイリアス宣言されたクラスの詳細とusing
、これが基本クラスのコンストラクター呼び出しにどのように/なぜ影響するのかを理解しようとしています。
サンプルコード
gcc 4.7.2(-std = gnu ++ 11でコンパイル)は、このコードに対して2つのエラーを生成します。これは、関連していると思います(ただし、方法はわかりません...)
エラー1
私が提起したstackoverflowの検索では、基本クラスを参照するときに名前空間が必要です。これは、さらに検索するための開始点として、挿入されたクラス名に言及しています。しかし、私が集めたものから、これはA
私がそれをした方法で(つまりとしてA(int i=42):BarInt(i){};
)コンストラクターを書くことができる理由BarInt(i)
と、名前空間で修飾する必要がない理由を説明していますN
。
では、なぜそれがうまくいかないのB
ですか?C ++ 11の「typedef」と「using」の違いは何ですか? はusing
古き良きものと同じなtypedef
ので、最初のエラーに対する私の質問は、クラス名を挿入するコンテキストで、エイリアス宣言されたクラス(BarFloat
私の例では)が通常のクラス(私の例では)とどのように異なるかということだと思います。BarInt
どんなポインタでも大歓迎です:)
エラー2
上記のサンプルコードですでに述べたように、空のFoo()
コンストラクターを導入すると、このエラーはなくなります。ただし、私が持っている質問は、なぜBarFloat(f)
空のFoo()
コンストラクターへの呼び出しをトリガーするのか、そしてその場合、どのようBarFloat.value
に23.0に設定されるのかということです。
ポストスクリプトム
これが私の最初の投稿です:こんにちはstackoverflowそしてあなたが彼らの問題で他の人を助けることを通してあなたがすでに私に提供してくれた途方もない助けに感謝します!
c++ - typedefと同じスコープでの同じ名前の宣言の使用
私はC++11標準(まあ、n3242ドラフト)とインターネットを調べましたが、正確な答えを見つけることができませんでした。以下のコードは、clang3.2とg++ 4.7.2、およびVisual Studio 2010で正常にコンパイルされますが、代わりにエラーが発生することが予想されます。
で構築:
clangおよびg++で生成された実行可能ファイルは「i」を出力します。これは、aがint型であり、typedefが優先されていることを示しているようです。clで生成された実行可能ファイルは、「class a_ns :: a_t」を出力します。これは、VisualStudioがusing宣言をより気に入っていることを示しているようです。
次の標準的な抜粋に従ってコードがコンパイルされないことを期待します。「宣言を使用するターゲットがすでにスコープ内にある宣言と競合する」と同様のエラーが発生することが予想されます。
7.1.3.6同様に、特定のスコープでは、クラスまたは列挙は、そのスコープで宣言され、クラスまたは列挙自体以外の型を参照するtypedef-nameと同じ名前で宣言されてはなりません。
7.3.3.1 using-declarationは、using-declarationが表示される宣言型領域に名前を導入します。
7.3.3.2すべてのusing-declarationは宣言です[...]
おそらく、この動作を説明する標準に欠けているものがあります(または、疲れすぎて明白なものを見ることができません)が、それを見つけることができないようです。
ありがとうございました。
c++ - コンパイラ エラーを引き起こさない同じ署名のテンプレート
次のプログラムは、2 つの別個の名前空間 (および) で 2つの関数テンプレートA::foo<>()
および を定義します。2 つの関数テンプレートは署名が同じで、2 番目のテンプレート パラメーターに割り当てられた既定の引数のみが異なります。最終的に、それらの名前は、対応する宣言のペアによってのスコープに取り込まれます。B::foo<>()
A
B
main()
using
ここでは、2 番目の宣言によってコンパイル エラーが発生すると予想using
されます。結局のところ、同じ名前空間でこれら 2 つのテンプレートを定義しようとすると、エラーが発生します。
驚いたことに、これを試したすべてのコンパイラ (GCC 4.7.2、GCC 4.8.0 ベータ、ICC 13.0.1、Clang 3.2) は、プログラムをコンパイルし、A::foo()
.
質問 #1: これは正しいですか? おそらく「診断不要」のケースでしょうか?C++11 標準への参照が推奨されます。
上記のプログラムのこのバリエーションを考えてみましょう。これは基本的に、名前空間ではなくクラスを使用して同じ効果を実現します。
このプログラムも上記のすべてのコンパイラでコンパイルされますが、2 番目のusing
宣言によってコンパイラ エラーが発生すると予想されます。
質問 #2: これは正しいですか? おそらく「診断不要」のケースでしょうか?C++11 標準への参照が推奨されます。
c++ - Using Declaration と Forward Declaration の競合
ブルドッグと散歩に行こう:)
クラスが宣言されている名前空間Street::House
( namespace 内)があるとします( in にします):Street
Bulldog
House/Bulldog.hpp
次に、私は持っていBulldog.hpp
ます:
何が起こっているかに注意してください:宣言と同様に、宣言Street::House::Bulldog
を名前空間に挿入しています。Street
Street::Bulldog
using
次に、Owner.hpp
クラスBulldog
が前方宣言されている場所があります。
最後に、私は持っていOwner.cpp
ます:
次の場所でコンパイル エラーが発生しますOwner.cpp
。
error: 'Bulldog' is already declared in this scope
この現象の自然な説明は、C++ がこれら 2 つのBulldog
クラスを異なるものとして扱うということのようですが、なぜでしょうか? この場合、あいまいさは見られません。つまり、コンパイラによって適切に実装されていれば、実際に機能する可能性があります。
どのような回避策を提案できますか? 私が考えることができるのは、単に from の前方宣言を削除し、 fromからto に移動することです。ただし、これにより、前方宣言ではなく正確な包含が行われます。Bulldog
Owner.hpp
#include "Bulldog.hpp"
Owner.cpp
Owner.hpp
c++ - 子が暗黙的に削除されたときに親代入演算子を継承する
GCC 4.6 では、ムーブ コンストラクターによって子の代入演算子が暗黙的に削除された場合でも、親の代入演算子を継承できます。GCC (および Clang) の新しいバージョンでは、これはもはや不可能です。子クラスに親の代入演算子を使用させる適切な方法は何ですか?
c++ - 仮想関数の定義に using を使用できないのはなぜですか?
私は最近using
、基本クラス関数を派生クラスの名前空間にインポートするための使用を発見しました (非表示になっている場合)。私はそれを使用して、派生クラスの関数の実装として基本クラスから関数をインポートしようとしていました:
A::foo()
これは、.NET の純粋な仮想関数であるため、コンパイルされませんC
。using B::foo;
の実装になることを期待していましたfoo()
。なぜそうではないのですか?