Fixing your code, the following would work:
template<class T> class TestTemplate { public: //constructor 1 template<class Y> TestTemplate(Y * p) { cout << "c1" << endl; } //constructor 2 template<class Y, class D> TestTemplate(Y * p, D d) { cout << "c2" << endl; } template<class A, class B> void foo(A a, B b) { cout << "foo" << endl; } }; int main() { TestTemplate<int> tp(new int()); tp.foo<int*, string>(new int(), "hello"); TestTemplate<int> tp2(new int(),2); }
You cannot use T
for the class template parameter and the constructor template parameter. But, to answer your question, from [14.5.2p5]:
Because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates.
Therefore, you cannot explicitly specify template arguments for constructor.