Maybe I'm confused, but I'm having trouble with explicit instantiation of variadic templates. Example: x.hh: template < class T, class ... P > std::shared_ptr < T > make(P ... args); xx.cc: template < class T, class ... P > std::shared_ptr < T > make(P ... args) { return std::shared_ptr < T > (new T(args ...)); }; template std::shared_ptr < File > make < File, char const *>(char const *); // works template std::shared_ptr < Include > make < Include, char const *, bool > (char const *, bool); // doesn't work That last line gets error: template-id 'make<Include, const char*, bool>' for 'std::shared_ptr<Include> make(const char*, bool)' does not match any template declaration (gcc 4.6) So ... should I write that differently (how?), or is gcc confused here?