Function overloading is more flexible than template function specialization -- Raymond Chen
When trying to specialize a templated function for specific types, it’s easy to fall into subtle traps around how parameter types are matched. A colleague recently ran into this issue while attempting to specialize a function for a Widget and a string literal, only to be met with confusing compiler errors that hinted at deeper quirks in C++'s type deduction and function template specialization rules.
Function overloading is more flexible (and more convenient) than template function specialization
by Raymond Chen
From the article:
A colleague of mine was having trouble specializing a templated function. Here’s a simplified version.
template<typename T, typename U> bool same_name(T const& t, U const& u) { return t.name() == u.name(); }They wanted to provide a specialization for the case that the parameters are a Widget and a string literal.
template<> bool same_name<Widget, const char[]>(Widget const& widget, const char name[]) { return strcmp(widget.descriptor().name().c_str(), name) == 0; }However, this failed to compile:
// msvc error C2912: explicit specialization 'bool same_name<Widget,const char[]>(const Widget &,const char [])' is not a specialization of a function templateWhat do you mean “not a specialization of a function template”? I mean doesn’t it look like a specialization of a function template? It sure follows the correct syntax for a function template specialization.

Registration is now open for CppCon 2025! The conference starts on September 15 and will be held
Registration is now open for CppCon 2025! The conference starts on September 15 and will be held
Registration is now open for CppCon 2025! The conference starts on September 15 and will be held
Modern C++ offers a variety of ways to work with key-value data structures like
Registration is now open for CppCon 2025! The conference starts on September 15 and will be held