問題タブ [template-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++ - メンバー関数 C++ の派生テンプレート オーバーライド戻り値の型
私は行列クラスを書いています。この定義を見てください:
generic_square_matrix クラスは、行列の乗算などの追加機能を提供します。これを行うことは問題ありません:
コンストラクターにより、タイプが generic_square_matrix でなくても、任意の正方行列を M に割り当てることができます。これが可能なのは、サポートされている関数のみで、データが子全体で変更されないためです。これも可能です:
ここでも同じ変換が適用されます。しかし、ここで問題が発生します。
これを解決するには、generic_square_matrix::minor が generic_matrix の代わりに generic_square_matrix を返すようにします。これを行う唯一の方法は、テンプレートの特殊化を使用することだと思います。しかし、特殊化は基本的に別のクラスのように扱われるため、すべての関数を再定義する必要があります。派生クラスの場合とは異なり、特殊化されていないクラスの関数を呼び出すことはできないため、関数全体をコピーする必要があります。これはあまり優れたジェネリック プログラミング ソリューションではなく、多くの作業が必要です。
C ++には、私の問題に対する解決策がほとんどあります。派生クラスの仮想関数は、基本クラスが返すクラスから派生したクラスである場合、基本クラスが返すものとは異なるクラスへのポインターまたは参照を返すことができます。generic_square_matrixはgeneric_matrixから派生していますが、関数はポインターも参照も返さないため、ここでは当てはまりません。
この問題の解決策はありますか (まったく別の構造が関係している可能性があります。私の唯一の要件は、次元がテンプレート パラメーターであり、正方行列に追加機能を持たせることができることです)。
前もって感謝します、
ルード
visual-c++ - ユーザー定義のクラス型テンプレート パラメーターのリンク エラー
C++ で単純な STL マップを実装しました。私が指示されたようにタイプとして比較を除外し、次に示すように比較を実装しました。
ここでは、tKey1 と tKet2 が比較対象の 2 つのキーです。これは、すべての基本的なデータ型と文字列でうまく機能しました。Testという名前のユーザー定義型のキーを比較するためのテンプレートの特殊化を追加し、次のように特殊化を追加しました。
これを実行すると、リンクエラーが表示されます
SimpleMap.obj : エラー LNK2005: "public: int __thiscall KeyCompare::operator()(class Test,class Test)" (??R?$KeyCompare@VTest@@@@QAEHVTest@@0@Z) は MapTest で既に定義されています.obj
SimpleMap.obj : エラー LNK2005: "public: __thiscall KeyCompare::~KeyCompare(void)" (??1?$KeyCompare@VTest@@@@QAE@XZ) は MapTest.obj で既に定義されています
SimpleMap.obj : エラー LNK2005: "public: __thiscall KeyCompare::KeyCompare(void)" (??0?$KeyCompare@VTester@@@@QAE@XZ) は MapTest.obj で既に定義されています
MapTest.cpp は、テスト ケースを記述したテスト ハーネス クラスです。複数のインクルードを停止するために、インクルード ガードも使用しました。
何が問題なのか分かりますか??
どうもありがとうございました!!
c++ - 派生クラスにテンプレートの特殊化を提供する最も簡単な方法
次のシナリオがあります。
たとえば、次のようなmy_traits
ものから派生したすべてのクラスに特化したいと思います。my_base
タグやメンバーを追加しmy_base
て簡単にすることに問題はありません。いくつかのトリックを見てきましたが、まだ道に迷っています。
これを簡単かつ短時間で行うにはどうすればよいでしょうか。
c++ - テンプレートの特殊化のための*暗黙的な*変換演算子の提供
テンプレート化されたsparse_vector<T>
クラスがあり、Boost UBLAS も使用しています。との間の暗黙的な変換を提供するにはどうすればよいですか?sparse_vector<double>
boost::numeric::ublas::compressed_vector<double>
std::vector<double>
との間の同様の変換も提供したいと思いboost::numeric::ublas::vector<double>
ます。
(C++0x を有効にして gcc 4.4 を使用しています。)
c++ - 複数の種類の文字列に特化したい場合、複数のテンプレートの特化が必要ですか?
例えば:
これは、特に const と non-const char* の 2 つのバリアントで、間違っているように見えます。ただし、VC++ 10 で次のように呼び出されるとconst char *
、変数を渡すだけで特殊char *
化されていないバージョンが呼び出されることを確認しました。
これを行う適切な方法は何ですか?
c++ - テンプレートパラメータをテンプレートパラメータとして使用する
次のコードが無効なのはなぜですか?
gcc 4.3.4は、「'>'トークンの前にプライマリ式が必要です」、つまり「S」が有効なプライマリ式ではなかったと文句を言います。
c++ - C++テンプレートの専門化
クラスがあります
Cをintに特化したいと思います。
intで機能するデフォルトのprintメソッドをそのままにして、定数を変更するだけです。一部の専門分野では、<<演算子がないため、K = 1を維持し、印刷方法を変更したいと思います。
どうすればよいですか?
c++ - Visual Studio 2005 での TCHAR を使用した C++ テンプレート関数の特殊化
テンプレート化された operator<< 関数を使用するロギング クラスを作成しています。ログ メッセージを書き込む前にワイドからナローへの変換を行えるように、テンプレート関数をワイド文字列に特化しています。TCHAR を正しく動作させることができません。特殊化を使用していません。アイデア?
関連するコードは次のとおりです。
そしてソースファイル
ここで、次のテスト プログラムを使用してこれらの機能を実行します。
上記のテストを実行すると、次のことがわかります。
残念ながら、それは正しくありません。変換できるように、最後のものを「TCHAR」にしたいと思います。Visual Studio のデバッガーによると、テスト 5 で呼び出されている関数にステップ インすると、型は wchar_t*& ですが、適切な特殊化を呼び出していません。アイデア?
関係があるかどうかはわかりませんが、これは Windows CE 5.0 デバイス上にあります。
c++ - テンプレート クラスのテンプレート メンバー関数を特殊化しますか?
次のように、特殊化する必要があるテンプレート メンバー関数を持つテンプレート クラスがあります。
VCはこれを正しく処理しますが、明らかにこれは標準ではなく、GCCは不平を言います:explicit specialization in non-namespace scope 'class X<T>'
私は試した:
しかし、これにより VC と GCC の両方が文句を言います。
これを行う正しい方法は何ですか?
c++ - テンプレートの特殊化に関するC++コンパイラエラー
それ自体がintパラメーターによってテンプレート化されているクラスCのテンプレートメソッドを特殊化したいと思います。
どうすればよいですか?
test()の特殊化は、「void test()の宣言に含まれるテンプレートパラメータリストが多すぎます」で失敗します。