問題タブ [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++ - Clang アクセス修飾子の順序と decltype
私は、このトークで Herb Sutter のラッパー クラスのアイデアに基づいたシンクロナイザー ヘルパー テンプレート クラスの作成を検討してきました。これは msvc ではそのままでは機能しません (ブレースの初期化を削除しない限り) が、ブレースの初期化が削除されれば問題ありません。 .
clang/gcc (ubuntu 12.10、gcc4.7.2、libc++ で自己ビルドされた clang (3.2)) では、プライベート アクセス修飾子をパブリックの前に表示する必要があるようです。これは少し奇妙に思えます。
gccのエラーは
error: ‘t_’ was not declared in this scope
そしてclangは
これは、私が認識していないテンプレート/declytpe の問題である可能性があり、誰かがこの問題を解決できるかどうか疑問に思っています。(関連する c++11 フラグでコンパイルされたすべて)
編集: カット アンド ペーストが必要な場合に備えて、ヨハネスのアイデアと完全なクラスを追加します。
c++ - 可変個引数テンプレートを使用した依存型
この関数宣言に何か問題がありますか?
私がそれを呼び出そうとすると、次のようになります:
MSVC2013 は言いerror C2027: use of undefined type 'std::tuple<Containers::value_type>
ます。
関数宣言を「late return」構文で書き直そうとしましたが、違いはありませんでした。
このコードがやろうとしていることを達成する方法はありますか?
c++ - 可変個引数テンプレートを使用した依存型の増加
これは、Visual Studio 2013 で処理できない C++ コードをいくつか提供した昨日の質問に続くもので、@galop1n がその場合に完全に機能する回避策を親切に提供してくれました。しかし、今は少し先に進んで、Visual Studio が再び私を苦しめています。
関数テンプレート foo またはクラス テンプレート Foo をインスタンス化しようとすると、次の 2 つのメッセージが表示されます。
Test.cpp(21): エラー C3546: '...': 展開できるパラメーター パックがありません
と
Test.cpp(21): エラー C3203: 'ValueType': 特殊化されていないエイリアス テンプレートは、テンプレート パラメーター '_Types' のテンプレート引数として使用できません。実際の型が必要です
それぞれの場合 (foo のインスタンス化または Foo のインスタンス化) で、両方のメッセージが「x」を定義する行を指しています。
更新: 私のMicrosoft バグ レポートには、(添付ファイルに) この問題のすべての基本的なバリアントが含まれています。そのため、修正を監視する場所になります。
c - 名前がプログラムの変数に依存する新しいファイルを作成します
「X」個の単純なテキストファイルを保存するプログラムを作成しようとしていますが、X はプログラムの実行後にユーザーが決定します。次の 2 つの問題を解決する方法について、ネット上でヘルプが見つからないようです。そのため、ヒントをいただければ幸いです。
1) テキストファイルの数がわからない場合、プログラムの開始時にこれらのテキストファイルを宣言するにはどうすればよいですか?
これまでのところ、私は使用に慣れています:
/li>しかし、私が本当に必要としているのは:
/li>頭に浮かぶ解決策はループのように見えますが、これがうまくいかないことはわかっています!
/li>
2) どのように名前を付けますか?
「textfile_1、textfile_2」などの単純な名前を付けたいのですが、次を使用してそれがどのように可能になるかわかりません。
/li>繰り返しますが、おそらくループ (?!) を作成することを考えましたが、これが機能しないことはわかっています。
/li>
プログラムを実行する前に、変数「X」が何であるかを知る方法はまったくありません。
編集:問題は解決しました-「FILE*」の配列を作成できることを知りませんでした。すべての助けに感謝します!
c++ - インスタンス化の時点以降、ADL によってベスト マッチが見つかりませんでした。これはUBですか?
次のコードを考えてみましょう。このコードでは、オーバーロードの場所がf
直感的ではない動作を引き起こしています。このコードは、Clang 3.4.1 と gcc 4.8 の両方で警告なしでコンパイルされます。
C++11 標準は、上記のコードが未定義の動作を呼び出すことを示唆しています。
【温度差候補】
テンプレート パラメーターに依存する関数呼び出しの場合、次の点を除いて、通常の検索規則を使用して候補関数が検索されます。
- 非修飾名ルックアップまたは修飾名ルックアップを使用したルックアップの部分では、テンプレート定義コンテキストからの関数宣言のみが検出されます。
- 関連付けられた名前空間を使用したルックアップの部分では、テンプレート定義コンテキストまたはテンプレート インスタンス化コンテキストのいずれかにある関数宣言のみが検出されます。
関数名が修飾されていない ID であり、呼び出しの形式が正しくないか、関連付けられた名前空間内のルックアップで、すべての翻訳単位のそれらの名前空間に導入された外部リンケージを持つすべての関数宣言が考慮された場合に、より適切な一致が見つかる場合。これらの宣言がテンプレート定義およびテンプレートのインスタンス化コンテキストで見つかった場合、プログラムは未定義の動作をします。
上記のコードは、この特定の未定義の動作を呼び出しますか? 高品質の実装が警告を報告することを期待できますか?
c++ - 従属修飾 ID を持つクラス メンバーの using 宣言は従属名にする必要がありますか?
C++11 標準のドラフト N3337 では、[namespace.udecl]
using 宣言は、using 宣言が現れる宣言領域に名前を導入します。
すべての using 宣言は宣言とメンバー宣言であるため、クラス定義で使用できます。
メンバー宣言として使用される using 宣言では、nested-name-specifier は、定義されているクラスの基本クラスに名前を付けるものとします。
これは通常、次の例のように、基本クラス内で保護された typedef を派生クラスで公開するために使用され、Clang の最新バージョンで正常にコンパイルされます。
using 宣言は、テンプレート クラスを参照できます。これはコンパイルされます:
依存する基本クラスのテンプレートを参照することもできます。以下は正常にコンパイルされます (typedef がコメント化されています)。
のコメントを外すtypename
と、インスタンス化時にエラーが発生しますB<int>
: 「エラー: 非型で使用される 'typename' キーワード」。
typedef のコメントを外すと、B
最初のインスタンス化の前に解析するときにエラーが発生します。Type
これは、コンパイラが依存型名として扱わないためだと思います。
の最後の段落は[namespace.udecl]
、using 宣言が依存する名前を指定する可能性があること、およびtypename
導入された名前のさらなる使用法を明確にするためにキーワードを使用する必要があることを示唆しています。
using-declaration がキーワード typename を使用し、従属名 (14.6.2) を指定する場合、using-declaration によって導入された名前は typedef-name として扱われます。
私の読書は、それが従属名であることを[temp.dep]
示唆しています。A<T>::Type
論理的には、using 宣言によって導入された名前も依存する必要がありますが[temp.dep]
、依存する using 宣言の場合については明示的に言及していません。何か不足していますか?
c++ - 基本クラスのメンバー データへの派生テンプレート クラス アクセス: 従属名の場合
次のコードの長いリストで、3 つの場所を探してください。
// "this->" can be omitted before first data[0]
と
// Compile error, if "this->" is omitted before first data[0]
と
// likewise, "this->" is required.
「this->」を省略できる場合と省略できない場合がある理由がわかりません。
コンパイル エラー: main.cpp:19:3: エラー: 'data' はこのスコープで宣言されていませんでした
それは単なるコンパイラのバグですか?私のコンパイラは GCC v4.8.1 と v4.8.2 です。ありがとう。ところで、QtCreator のデフォルトの intelli-sense は、実際には、3 つの場所すべてで「this->」なしで「data[0]」を認識できます。
コードリストは次のとおりです。
==更新==
誰かが非常によく似た質問(おそらく重複している可能性があります)と回答を指摘しており、その質問のタイトルは説明的でさえあるので、私はそのタイトルに似たタイトルを変更しました(パラメーター依存関係の違いを除く)
しかし、その質問に対する回答を読んだ後でも、私はまだ混乱しています。回答は、変数が非依存の名前である場合、コンパイラは基本テンプレート クラスで名前を検索しないというFAQ [ここにリンク]を示しています。ただし、この例では、変数 ( ) はタイプが であり、テンプレート変数であるdata
ため、従属名です。T
T
私はまだ答えを待っています。