問題タブ [explicit-specialization]
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++ - 明示的なメンバーの特殊化
g++ 3.4.5 は次のコードを受け入れます。
しかし、それが実際に合法的な C++03 であるかどうかはわかりません。特に、
[14.7p3] クラス テンプレート、クラス テンプレートのメンバー、またはクラス メンバー テンプレートの明示的な特殊化宣言では、明示的に特殊化されるクラスの名前は template-id になります。
この要件は、この例の最後で非 typedef バージョンを使用する必要があることを示していますか? それとも私は何かを誤解しましたか?
編集: さらなる証拠:欠陥レポート 403は、型 (そのコンテキストでは、関数呼び出し式の引数の型) を template-id と言うのは正しくないことを示唆しています。 1。標準のその後のドラフトでは、3.4.2の「 template-id 」の代わりに「クラス テンプレートの特殊化」が使用されています。
A<B>
これは、 と が同じ型をC
表している (そして、同一またはほぼ同一の意味的意味を持っている)が、テンプレート ID でありA<B>
、テンプレートIDでC
はないという引数をサポートします。それらのトークンの意味。
c++ - 明示的な特殊化、C++
オブジェクトの明示的な特殊化の書き方
仮想メソッドで clear()?
クラスカー:
コンパイル エラー:
エラー 16 エラー C3855: 'List': テンプレート パラメーター 'Car' は宣言 h:...\List.hpp と互換性がありません 75 エラー 20 エラー C2264: 'List::clear': 関数の定義または宣言にエラーがあります。関数が呼び出されていません h:...\List.hpp 75
しかし、この構造は大丈夫です
c++ - この C++ の明示的なテンプレート特殊化コードが違法なのはなぜですか?
(注:違法であることは知っています。言語がそうする理由を探しています。)
エラー:
Google との簡単なパスで、この仕様の引用が見つかりましたが、それは理由ではなく、何を提供するだけです。
編集:
いくつかの応答は、ルールがこのようになっているという議論を進めています (たとえば、私の推測を確認しました)。そうしないと、One Definition Rule (ODR)に違反するからです。ただし、この場合、次の 2 つの理由で成立しないため、これは非常に弱い議論です。
- 明示的な特殊化を別の翻訳単位に移動すると、問題が解決し、ODR に違反していないように見えます (リンカーがそう言っています)。
- (関数に適用される) ODR の短い形式は、任意の関数に対して複数の本体を持つことはできないということです。私はそうではありません。関数の本体が定義される唯一の場所は明示的な特殊化で
Foo<int>
あり、特殊化する汎用本体がないため、 への呼び出しはテンプレートの汎用特殊化を定義できません。
この件に関する憶測:
ルールが存在する理由についての推測: 最初の行が (宣言ではなく) 定義を提供した場合、複数の定義を取得するため、インスタンス化後の明示的な特殊化が問題になります。しかし、この場合、目に見える唯一の定義は明示的な特殊化です。
奇妙なことに、次の(または私が取り組んでいる実際のコードのようなもの)が機能します:
ファイル A:
ファイル B:
しかし、一般的にそれを使用すると、スパゲッティのインポート構造が作成されます。
c++ - テンプレート関数をオーバーロードするときの明示的な特殊化と通常の関数の違い
今日は順調です。ここにn00bの質問番号7があります:
テンプレート関数をオーバーロードしようとしたときの明示的な特殊化と通常の関数の違いは何ですか?
明示的な特殊化を使用するための適切な状況は何ですか?私はそれを完全には理解していません:
反対に:
c++ - クラステンプレートの明示的な特殊化で他の何かを宣言することもできますか?
このコードが無効だったらいいのにと思います。しかし、それは概念的には健全であり、Comeauは受け入れませんが、GCCはそれを受け入れます。
(編集:上記はコンパイルされますが、どのスコープr
にも宣言されていないようですので、基本的に無視されます。)
明示的な特殊化は、テンプレートとクラスの間の一種のネザー領域に入力されます。明示的な特殊化によって宣言された型は、定義されると完了します。コンパイラの観点からは、これはテンプレートではありません。パラメータ化されたテンプレートの場合、オブジェクトを宣言することは不可能です。§14/3を検討してください:
テンプレート宣言、明示的な特殊化、または明示的なインスタンス化では、宣言内のinit-declarator-listに最大で1つの宣言子を含める必要があります。このような宣言を使用してクラステンプレートを宣言する場合、宣言子は許可されません。
「クラステンプレートの宣言に使用される」とはどういう意味ですか?明らかに、プライマリテンプレートはクラステンプレートを宣言します。また、§14.5.5/ 1(FDIS番号)によると、部分的な特殊化も同様です。
クラステンプレート名がsimple-template-idであるテンプレート宣言は、simple-template-idで指定されたクラステンプレートの部分的な特殊化です。
ただし、明示的な特殊化に関しては、標準はトークンシーケンスが前に付いた宣言の観点から説明していますtemplate<>
。テンプレートのように見え、template-nameという名前が付けられていますが、テンプレートを宣言していないようです。
本当に奇妙なことは、§14/3が宣言者の数を「最大で1つ」に制限していることです。関数テンプレート宣言、明示的な特殊化、またはインスタンス化には、宣言子が1つだけ必要です。クラステンプレートを含むすべての宣言は、正確にゼロでなければなりません…明示的な特殊化を除いて、それは亀裂を通り抜けているようです。忠実に、GCCは許可することを拒否します
私はGCCの解釈に同意する傾向がありますが、それはナンセンスかもしれません。残念ながら、欠落しているセミコロンを検出する機能が阻害されている可能性があります。許可される宣言子の数を正確にゼロにしてください。
c++ - lib内外に特化したテンプレートクラス
この合成例を考えてみましょう。Visual Studio 2010 ソリューションに 2 つのネイティブ C++ プロジェクトがあります。1 つはコンソール exe で、もう 1 つは lib です。
lib には 2 つのファイルがあります。
と
そしてexeの1つのファイル:
私は実際にこのようにするべきではありませんが、これは何が起こっているのかを理解するためのものです. そして、それは、何が起こるかです:
リンカは lib のバージョンのTImage<char>
を exe のバージョンの でオーバーライドしTImage<char>
ます。しかし、exe のバージョンの がないためTImage<int>
、lib のバージョンのTImage<int>
?.. が保持されます。
更新:以下の効果の説明は正しいです、ありがとう。しかし、問題は「これがどのように起こったのか」でした.. 「複数定義されたシンボル」のようなリンカーエラーが発生することを期待していました。したがって、最も適切な回答はAntonio Pérez の回答からのものです。
c++ - std名前空間に特化できるものとできないものは何ですか?
ユーザーは、std
名前空間に明示的な特殊化を追加できます。ただし、専門化することを明示的に禁止されているテンプレートがいくつかあります。
専門にできるテンプレートとできないテンプレートは何ですか?
c++ - std :: unordered_setクラスFooのメンバーとして
独自のタイプのunordered_setをメンバーとして持つクラスを作成しています。したがって、のスペシャライゼーションを作成する必要がありhash<Foo>
ます。この特殊化は、Fooが宣言された後に定義する必要があります。hash<Foo>
しかし、メンバーを定義する前に、すでに専門化が必要であるように思えunordered_set<Foo>
ます。少なくとも、コンパイルされず、そこで失敗します。ハッシュテンプレートの前方宣言を試みましたが、それでも機能させることができませんでした。
関連するコードスニペットは次のとおりです。
前もって感謝します
c++ - 関数テンプレートをクラス テンプレートで完全に特殊化するにはどうすればよいですか?
上記のコードで、関数 foo をクラス テンプレートで明示的に特殊化するにはどうすればよいですか?
c++ - 関数テンプレートでの配列型推定
私は次のようなテンプレートメソッドを持っています:-
そして、上記の方法を使用したコードがあります:-
私の質問は、なぜテンプレート引数を明示的に指定する必要があるのですか? 次のように使用できるように自動推定できませんか:-
私は基本的な何かが欠けていると確信しています!ハンマーを惜しまない!