クラステンプレートのテンプレートコンストラクター-2番目のパラメーターのテンプレート引数を明示的に指定する方法は?
コンストラクター2のテンプレート引数を明示的に指定しようとすると、コンパイルエラーが発生します。コンストラクター2を明示的に呼び出したい場合は、どうすればよいですか。
これは、削除者のタイプを明示的に指定する場合のboost::shared_ptrの場合と同じ状況であることに注意してください。
注意:非構築関数foo()の場合、明示的に指定すると正常に機能します。
注意:テンプレート引数の推論は通常は正常に機能するため、コンストラクター2に対して2番目のものを明示的に指定しなくても正常に機能することはわかっています。明示的に指定する方法に興味があります。
template<class T> class TestTemplate {
public:
//constructor 1
template<class Y> TestTemplate(T * p) {
cout << "c1" << endl;
}
//constructor 2
template<class Y, class D> TestTemplate(Y * p, D d) {
cout << "c2" << endl;
}
template<class T, class B>
void foo(T a, B b) {
cout << "foo" << endl;
}
};
int main() {
TestTemplate<int> tp(new int());//this one works ok call constructor 1
//explicit template argument works ok
tp.foo<int*, string>(new int(), "hello");
TestTemplate<int> tp2(new int(),2);//this one works ok call constructor 2
//compile error when tried to explicit specify template argument for constructor 2
//How should I do it if I really want to explicit call constructor 2?
//TestTemplate<int*, int> tp3(new int(), 2); //wrong
//TestTemplate<int*> tp3<int*,int>(new int(), 2); //wrong again
return 0;
}