2012-03-14 8 views
0

可能性の重複:
C++ invoke explicit template constructorコンストラクタテンプレートの選択方法は?

まず私はテンプレートメンバ関数を持つクラスのデータを持っている想像: -

class Data 
{ 
public: 
    template <class Loader> void load(const std::string& filename); 
}; 

私はこのようにこれを使用することができます -

Data data; 
data.load<SomeLoader>(filename); 

とすべて正常に動作します。コンパイル時に、クラスのどのクラスを使用してデータをロードするかをテンプレートパラメータで選択できます。完璧にコンパイルするようだ

私はコンストラクタでこれを行う方法を動作することはできませんが...

class Data 
{ 
public: 
    template <class Loader> Data(const std::string& filename); 
}; 

が、私は実際には関数を呼び出す方法を動作するように見えることはできません。

Data<SomeLoader> data; 

テンプレートのコンストラクタではなくクラステンプレートを呼び出すため、これは機能しません。

ここにいくつかの構文がありますか? (SomeLoader型のコンストラクタパラメータを追加すると、コンパイラが使用するクラスを正しく推測しますが、ここで行う必要はありません)

+0

ああ、私はこれを探して何も見つけられませんでした。リンクを追加していただきありがとうございます – jcoder

答えて

2

構文が不足していません。明示的にコンストラクタテンプレートの特殊化を使用することは不可能です。明示的なテンプレート引数リストが関数テンプレート名を次のので

、およびコンバージョンメンバ関数テンプレートとコンストラクタメンバ関数テンプレートを使用しなくてもと呼ばれているので:

標準は、[temp.arg.explicit]/7でこのに関するメモを持っていますこれらの関数テンプレートに明示的なテンプレート引数リストを提供する方法はありません。

+0

これについていくつかのドキュメントを提供できますか? –

+1

@ルチアン。 "明示的なテンプレートインスタンス化でコンストラクタを呼び出すための構文はありません"という標準の段落はありません(ちなみに、これを行うには、新しい配置を使用してください。 EDIT **ああ。どうやらこの規格に明示的に言及しているのは標準*です。どのように思慮深い。重複を参照してください。 –

+0

@KonradRudolph:ああ、そこには、私はどこかでそれを見たことが分かっていた。 – Mankarse

0

これはできません。コンパイラは型を推論できず、コンストラクタに渡すことができないためです。

いくつかの可能な解決策:
1.テンプレート
2.コンストラクタにいくつかのパラメータを渡すデータクラスを作ります。これは、依存関係注入を使用してローダーをコンストラクターに渡すためのより良い解決策かもしれません。

関連する問題