問題タブ [dependent-name]
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++ - typename キーワードとネストされた名前指定子
最初のケースは正しいのに、2 番目のケースは正しくないのはなぜですか? その制限の意味がわかりません。
とにかく、なぜ最初のケースが許可されているのですか? ::A
テンプレート パラメータに依存する名前ではありません。その意味は何ですか?
c++ - 非型テンプレート パラメータに依存する static_assert (gcc と clang で異なる動作)
で一般的なテンプレートのインスタンス化を無効にしようとしているときに、テンプレートがインスタンス化されていない場合でも上記のコードがアサート エラーを生成することをstatic_assert
発見しました。clang
gcc
Hitchhiker
42
いじってみると、次のように主張していることがわかりました。
両方のコンパイラで同じように動作します。アサートは、一般的なテンプレートがインスタンス化された場合にのみ開始されます。
標準は何と言っていますか、どのコンパイラが正しいですか?
c++ - 再び typename と template キーワードについて
このトピックに関する多くの回答を注意深く読みましたが、ネストされたテンプレート クラスのメンバーである非テンプレート関数のスコープで、これら 2 つのキーワードが必要な場合と必要でない場合を正確に把握できません。
私のリファレンス コンパイラは GNU g++ 4.9.2 と clang 3.5.0 です。
次のコードでは、何が起こるかを説明するためにコメントを埋め込んでいますが、それらの動作はほとんど変わりません。
では、スコープ内にf
依存Pa<double>::Pe<BBB>
する名前がありますか?
そしてどうPa<AAA>::Pe<int>
ですか?
そして、結局のところ、引用された 2 つのコンパイラーのこのような異なる動作はなぜでしょうか?
誰でもパズルを解くことを明確にすることができますか?
c++ - this-> が依存する基底クラスのメンバーにアクセスできるようにするルールは何ですか?
x
ご存知のように、メンバーが依存基底クラスにあるため、以下のコードは形式が正しくありません。ただし、指定された行に変更x
するthis->x
とエラーが修正されます。
この動作が標準でどのように指定されているかについて説明をお願いします。[temp.dep]/3 によると:
クラスまたはクラス テンプレートの定義で、基本クラスがテンプレート パラメーターに依存している場合、クラス テンプレートまたはメンバーの定義時点での非修飾名ルックアップ中、またはクラス テンプレートまたはクラス テンプレートのインスタンス化中のいずれかで、基本クラス スコープは検査されません。クラス テンプレートまたはメンバー。
x
これは、単独で使用すると失敗する理由を説明しているようです。名前x
は定義の時点で調べられ、基本クラスのスコープは調べられません。しかし、 を使用するとどうなるthis->x
でしょうか? 現在、名前x
は依存しており、そのルックアップはインスタンス化まで延期されています。しかし、引用されたパラグラフは、 inのルックアップがまだ修飾されていないルックアップであるため、インスタンス化の時点でもそれをx
見つけてはならないことを暗示しているようです。x
this->x
実装がこのように動作しないことは明らかであり、テンプレートがインスタンス化されると基本クラスのスコープが検索されることは広く理解されています。
- 引用された段落を誤解しましたか?
- 「正しい」動作を指定する段落はありますか?
c++ - 従属名が実際に「テンプレート テンプレート パラメータ」であることを示すための「typename」と同等
適切な構文が見つからないコードの一部を最小限の例に減らしました。
次の定義を仮定しましょう (「理由」について心配する必要はありません ;)
現在、C++11 以降では、クラス テンプレートまたは型エイリアス テンプレートのいずれかを使用して、テンプレートをインスタンス化できますClient
。次の関数は問題なくコンパイルされます。
しかし、次の場合、与えられたテンプレート引数Client
が従属名である場合、適切な構文を見つけることができません:
Clang (3.6 でテスト済み) は、次のコンパイル エラーを出力しています。
この構文を修正できますか?
c++ - 親クラスの変数の使用
テンプレートを使用してスタックを実装しようとしています。私の質問は、この状況で親クラスの変数をどのように使用するのですか?
この場合、私のコンパイル エラーは次のとおりです。'top, a, size' はこのスコープで宣言されていません。