При попытке специализировать такую функцию: Код (C): template <typename T, typename U> inline U ValToStr(const T& Value); template <typename T> inline std::string ValToStr<T, std::string>(const T& Value) { std::ostringstream OutputStringStream; OutputStringStream << Value; return std::string(OutputStringStream.str()); } template <typename T> inline std::wstring ValToStr<T, std::wstring>(const T& Value) { std::wostringstream OutputStringStream; OutputStringStream << Value; return std::wstring(OutputStringStream.str()); } ... int main() { std::string str1 = ValToStr<int, std::string>(123); std::wstring str2 = ValToStr<int, std::wstring>(456); } получаю ошибку на обоих специализированных реализациях: "error C2768: ValToStr: недопустимое использование явных аргументов шаблона". Как специализировать их правильно?
Частичная специализация шаблонов функций не допускается. Используйте шаблоны структур/классов: Код (C++): #include <iostream> #include <sstream> namespace internal { template< typename T, typename U > struct ValToStr; template< typename U > struct ValToStr< std::string, U > { static inline std::string exec(const U& val) { std::ostringstream out_string_stream; out_string_stream << val; return out_string_stream.str(); } }; template< typename U > struct ValToStr< std::wstring, U > { static inline std::wstring exec(const U& val) { std::wostringstream out_string_stream; out_string_stream << val; return out_string_stream.str(); } }; } template< typename T, typename U > inline T val_to_str(const U& val) { return internal::ValToStr< T, U >::exec( val ); } int main() { std::cout << val_to_str< std::string >(10) << std::endl; std::wcout << val_to_str< std::wstring >('a') << std::endl; }