問題タブ [class-template]
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++ - 特定のクラス テンプレート (特殊化) がインスタンス化されている場合にのみ、初期化関数を呼び出す方法はありますか?
さまざまな計算機能のラッパーを設計しています。基礎となるバックエンドの一部では、他の API 呼び出しが行われる前に、いくつかの init 関数を呼び出す必要があります。メインの前に初期化される静的変数を使用し、ここで説明されているように関数にラップして、初期化中に生成されたエラーをキャッチできるようにすることができます。
これを処理するためのより良い方法があるかどうか疑問に思います。すべてが typedef または static メンバーであるため、クラス テンプレートのインスタンスは存在しないことに注意してください。
c++ - テンプレートクラスとクラス定義内の暗黙的なテンプレート引数を区別する方法は?
C++ では、テンプレート クラスのインスタンスではなく、テンプレート クラスを参照するテンプレート引数を使用できます。たとえば、fun
以下の関数。
同時に、クラス定義内でテンプレート引数を省略できる機能があります。たとえば、 の定義では、 を含意するtemplate<class T> class A
と言うことができます。A
A<T>
両方のルールが潜在的にあいまいさを生み出す可能性があるケースを見つけました。さらに、あいまいさを解決することはできません。これは MWE であり、 の定義では、としてではなくテンプレート クラスとしてtemplate<class T> class B
参照する必要があります。B
B<T>
(関数g
はクラス内で定義したいフレンド関数であるため、これを行う必要があります。)
Clang 3.5 では上記のエラーが発生しますが、GCC 4.9.2 では問題ありません。最悪の部分は、追加の仕様を作成してあいまいさを解決できないことです。
たとえば、私は試しました:
それでも同じエラーが発生します。
テンプレートクラスでB
はないclang(または問題のあるコンパイラ)に伝える方法はありますか?B<T>
B
(例を簡略化するためにいくつかの C++11 構文を使用しましたが、問題は C++98 にも当てはまります。正しい命名規則を使用していない場合は、修正するか、お知らせください。)
c++ - リンク リスト関数の実装に関するヘルプ: insertEnd C++
そのため、リンク リストの最後にリンク リスト ノードを挿入する関数 insertEnd の定義を実装しました。ほとんどの場合、それは単独で動作するようですが、他の関数 (2 つのリンクされたリストを連結するなど) で使用すると問題が発生するようで、呼び出されたときにコンソールに何も表示されないため、ブレークポイントを使用してデバッグする
編集:これが私がinsertEndを使用しようとしているものです(連結する関数)
私が最初にしたことは、リンクされたリストの先頭に挿入される別の挿入を使用することでしたが、これは機能しましたが、それはこの新しいオーバーロードされた関数が想定していることではありません (あるリストを別のリストの後ろに追加することを想定しています)、だから私はそれを使用しようとするためにinsertEndを作成しました。
c++ - テンプレート INL ファイルについて非常に混乱している
さて、私はテンプレート クラスの実装ファイルを把握していると思っていましたが、どうやらそうではないようです... VS 2013 C++ ソリューションには次のファイルがあります。
メイン.cpp
StateManager.h
StateManager.inl
State.h
State.inl
このプロジェクトをビルドすると、次のエラーが発生します。
エラー 10 エラー C1903: 以前のエラーから回復できません。コンパイルを停止します state.inl 9 1
エラー 9 エラー C2065: 'context': 宣言されていない識別子 state.inl 8 1
エラー 7 エラー C2065: 'manager': 宣言されていない識別子 state.inl 7 1
エラー 8 エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int state.inl 7 1 をサポートしていません
エラー 6 エラー C2039: '状態': '`グローバル名前空間'' のメンバーではありません state.inl 6 1
エラー 1 エラー C2143: 構文エラー: ';' がありません 前 '<' state.inl 2 1
エラー 2 エラー C2988: 認識できないテンプレートの宣言/定義 state.inl 2 1
エラー 3 エラー C2059: 構文エラー: '<' state.inl 2 1
エラー 4 エラー C3083: 'Context': '::' の左側のシンボルは、state.inl 2 1 型でなければなりません
エラー 5 エラー C2039: 'Context' : '`global namespace'' のメンバーではありません state.inl 2 1
これらのエラーを修正する方法についてのヘルプは大歓迎です!
c++ - 次のプログラムは、標準に従ってコンパイルする必要がありますか?
同じコードのコンパイルとリンクで MSVC と GCC (おそらく clang も) の不一致を発見した後、このプログラムが実際にコンパイルしてリンクする必要があるかどうかに興味を持ちました。私はそれを別の方法で書きます。プログラムは次の 3 つのファイルで構成されます。
チャンネル
A.cpp:
B.cpp:
MSVC からの結果のリンカー エラーは次のとおりです。
A.obj : エラー LNK2019: 未解決の外部シンボル "public: void __thiscall A::func(void)"
したがって、基本的には、に配置された定義からシンボルを作成しないことにしますB.cpp
。バグとして強く疑うのは、特殊化されていない定義func
を構造体定義の外に移動し、特殊化宣言の上に配置することでプログラムのリンクが成功することですが、確認したいと思います。
だから私の質問は - このプログラムは、準拠したコンパイラ/リンカーによってエラーなしでコンパイルおよびリンクされるべきですか?
c++ - この swap() の呼び出しがあいまいなのはなぜですか?
次のプログラム
私のシステムでは、次のコンパイラ エラーが発生g++
しclang
ます。
std::swap
がオーバーロードの候補と見なされている理由はわかりませんが、foo
の の使用と関係がありstd::allocator<T>
ます。
の 2 番目のテンプレート パラメーターを削除foo
すると、プログラムをエラーなしでコンパイルできます。
c++ - C++ のクラス テンプレート内の関数から別のメンバー関数を呼び出す
myTemplate
いくつかのメンバー変数と 2 つのメンバー関数 、funcTempA
、という名前のクラス テンプレートがあるとしfuncTempB
ます。
funcTempB
funcTempA
その実装で呼び出します。それを呼び出すための正しい構文を知りたいだけです。