2011-06-22 8 views
0

私はstd::vector<T>を取るコンストラクタを持つテンプレートクラスを持っています。 1つのオブジェクトを除いたすべてのオブジェクトに対して、私は操作Aをしたい。しかし、その1つのオブジェクトに対しては、他のものをいくつか実行したい。B.異なるボディを持つメソッドのテンプレート明示的インスタンス化

テンプレートクラスのコンストラクタの明示的なインスタンス生成を作成する可能性はありますか? ?私はそれが十分に正確に記述されることを望む。

よろしく

アップデート:私は今、テストケースを実装している:

//header 

Container(const std::vector<T>& source) 
{...} 

//source code 

template <> Container<int>::Container(const std::vector<int>& source) 
{ 
    throw 42; 
} 

この例では、コンパイルしたが動作しません。これをdllにエクスポートして、汎用パラメータintを持つクラスのインスタンスを作成しようとするたびに呼び出されるようにしたいと考えています。しかし、今のように、他のすべてのオブジェクトに使用される標準のコンストラクタを呼び出すだけです。宣言に加えなければならない変更はありますか?

更新:私は成功しました!ヘッダーファイルにコピーするだけでした。

更新:もう、別の問題があります。私は「シンプルな」タイプを専門にすることはできますが、テンプレートはできません。私はそれをこの方法を試してみました:

template<typename T> 
Container<MyClass<T>>::Container(const std::vecror<MyClass<T>>& source) 
{...} 

私はすべてのMyClassのオブジェクトのためにそれを専門としたいが、MyClassの自体がテンプレートとして生きすることができなければなりません。

+3

それは十分ではありません。あなたは何をしたいのか疑似コードを少なくとも投稿できますか? –

+0

*明示的なインスタンス化*を作成しますか?おそらく明示的な**特殊化**を作成することを意味します。インスタンス化を作成せず、インスタンス化を暗黙または明示的に起動できますが、作成されません。 –

答えて

5

質問が不明です。おそらくあなたは次のようなものを意味するでしょうか?

+0

それはまさに私が意味していたものです。ありがとうございました! PS:Visual Studio 2005を使用しています。 –

0

どのコンパイラ? 古いバージョンのg ++​​コンパイラや、SolarisとHPUXのC++コンパイラで、テンプレートのインスタンス化に問題がありました。 template <>は、明示的なインスタンス化を指定するために使用されます。 私はクラスのメソッドだけを専門化していないのは、長い時間です。

試しましたか?

template <> TemplateClass<InstanciedType>::TemplateClass() { 
    ... 
} 

ここで、TemplateClassは、オーバーライドするテンプレートクラスインスタンスです。

+0

'template <>'は特殊化を行います。明示的なインスタンス化の目的で 'template'を参照している可能性があります – Nick

0

を私が正しくあなたの質問を理解している場合、あなたはこれをしたい:

template< typename T > 
struct A 
{ 
    template< typename P > 
    A(std::vector<P> &v) 
    { 
    } 
}; 
関連する問題