Специализация шаблонной функции - почти всегда неправильный ответ.
Классы - это плохие пространства имен.
Просто перегрузите вместо специализации.
namespace StringUtils {
template <typename T>
std::string toString(const T& t){
using std::to_string;
return to_string(t);
}
inline std::string toString(std::string s){ return std::move(s); }
}
Разрешение перегрузки делает то, что выхотите, и это позволяет эффективно изменять сигнатуру (как выше, где я беру s
по значению, что могло бы избежать дополнительного выделения кучи).
Также обратите внимание, что я включил расширение ADL to_string
для пользовательских классов,Просто перегрузите to_steing(X)
в пространстве имен X
, и StringUtils::toString(X)
найдет его.
Ваша непосредственная проблема заключается в том, что вам нужно отметить специализацию inline
.