問題タブ [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.

0 投票する
4 に答える
972 参照

c++ - メンバー関数 C++ の派生テンプレート オーバーライド戻り値の型

私は行列クラスを書いています。この定義を見てください:

generic_square_matrix クラスは、行列の乗算などの追加機能を提供します。これを行うことは問題ありません:

コンストラクターにより、タイプが generic_square_matrix でなくても、任意の正方行列を M に割り当てることができます。これが可能なのは、サポートされている関数のみで、データが子全体で変更されないためです。これも可能です:

ここでも同じ変換が適用されます。しかし、ここで問題が発生します。

これを解決するには、generic_square_matrix::minor が generic_matrix の代わりに generic_square_matrix を返すようにします。これを行う唯一の方法は、テンプレートの特殊化を使用することだと思います。しかし、特殊化は基本的に別のクラスのように扱われるため、すべての関数を再定義する必要があります。派生クラスの場合とは異なり、特殊化されていないクラスの関数を呼び出すことはできないため、関数全体をコピーする必要があります。これはあまり優れたジェネリック プログラミング ソリューションではなく、多くの作業が必要です。

C ++には、私の問題に対する解決策がほとんどあります。派生クラスの仮想関数は、基本クラスが返すクラスから派生したクラスである場合、基本クラスが返すものとは異なるクラスへのポインターまたは参照を返すことができます。generic_square_matrixgeneric_matrixから派生していますが、関数はポインターも参照も返さないため、ここでは当てはまりません。

この問題の解決策はありますか (まったく別の構造が関係している可能性があります。私の唯一の要件は、次元がテンプレート パラメーターであり、正方行列に追加機能を持たせることができることです)。

前もって感謝します、

ルード

0 投票する
2 に答える
624 参照

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 は、テスト ケースを記述したテスト ハーネス クラスです。複数のインクルードを停止するために、インクルード ガードも使用しました。

何が問題なのか分かりますか??

どうもありがとうございました!!

0 投票する
1 に答える
1429 参照

c++ - 派生クラスにテンプレートの特殊化を提供する最も簡単な方法

次のシナリオがあります。

たとえば、次のようなmy_traitsものから派生したすべてのクラスに特化したいと思います。my_base

タグやメンバーを追加しmy_baseて簡単にすることに問題はありません。いくつかのトリックを見てきましたが、まだ道に迷っています。

これを簡単かつ短時間で行うにはどうすればよいでしょうか。

0 投票する
1 に答える
673 参照

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 を使用しています。)

0 投票する
3 に答える
161 参照

c++ - 複数の種類の文字列に特化したい場合、複数のテンプレートの特化が必要ですか?

例えば:

これは、特に const と non-const char* の 2 つのバリアントで、間違っているように見えます。ただし、VC++ 10 で次のように呼び出されるとconst char *、変数を渡すだけで特殊char *化されていないバージョンが呼び出されることを確認しました。

これを行う適切な方法は何ですか?

0 投票する
2 に答える
254 参照

c++ - テンプレートパラメータをテンプレートパラメータとして使用する

次のコードが無効なのはなぜですか?

gcc 4.3.4は、「'>'トークンの前にプライマリ式が必要です」、つまり「S」が有効なプライマリ式ではなかったと文句を言います。

0 投票する
2 に答える
556 参照

c++ - C++テンプレートの専門化

クラスがあります

Cをintに特化したいと思います。

intで機能するデフォルトのprintメソッドをそのままにして、定数を変更するだけです。一部の専門分野では、<<演算子がないため、K = 1を維持し、印刷方法を変更したいと思います。

どうすればよいですか?

0 投票する
4 に答える
1021 参照

c++ - Visual Studio 2005 での TCHAR を使用した C++ テンプレート関数の特殊化

テンプレート化された operator<< 関数を使用するロギング クラスを作成しています。ログ メッセージを書き込む前にワイドからナローへの変換を行えるように、テンプレート関数をワイド文字列に特化しています。TCHAR を正しく動作させることができません。特殊化を使用していません。アイデア?

関連するコードは次のとおりです。

そしてソースファイル

ここで、次のテスト プログラムを使用してこれらの機能を実行します。

上記のテストを実行すると、次のことがわかります。

残念ながら、それは正しくありません。変換できるように、最後のものを「TCHAR」にしたいと思います。Visual Studio のデバッガーによると、テスト 5 で呼び出されている関数にステップ インすると、型は wchar_t*& ですが、適切な特殊化を呼び出していません。アイデア?

関係があるかどうかはわかりませんが、これは Windows CE 5.0 デバイス上にあります。

0 投票する
2 に答える
757 参照

c++ - テンプレート クラスのテンプレート メンバー関数を特殊化しますか?

次のように、特殊化する必要があるテンプレート メンバー関数を持つテンプレート クラスがあります。

VCはこれを正しく処理しますが、明らかにこれは標準ではなく、GCCは不平を言います:explicit specialization in non-namespace scope 'class X<T>'

私は試した:

しかし、これにより VC と GCC の両方が文句を言います。

これを行う正しい方法は何ですか?

0 投票する
2 に答える
1601 参照

c++ - テンプレートの特殊化に関するC++コンパイラエラー

それ自体がintパラメーターによってテンプレート化されているクラスCのテンプレートメソッドを特殊化したいと思います。

どうすればよいですか?

test()の特殊化は、「void test()の宣言に含まれるテンプレートパラメータリストが多すぎます」で失敗します。