If your class template does not need to declare a copy constructor (in general), you can declare the constructor as
Foo(Foo<Bar> const& bar);
which will be a conversion constructor in general and a copy constructor for Foo<Bar> . Other specializations will use the implicitly declared copy constructor, where applicable.
Otherwise, creating a template constructor ensures that it is not a special member. In this case, care should be taken that this constructor does not interfere with the copy constructor. This is not nice, but you can do it:
template<typename U> Foo(U bar, typename boost::enable_if<boost::is_same<U, Foo<Bar> > >::type* = 0);
This is a constructor that is not a copy constructor and will only be used when arguments of type Foo<Bar> are passed. Note that due to overload resolution rules, the copy constructor Foo<Bar> will be preferable to this constructor.
The previous one is for C ++ 03. Here's a simple C ++ 11 solution:
template<int = 0> Foo(Foo<Bar>);
source share