Специализация шаблонов с несколькими шаблонными аргументами

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 6 ноя 2017.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    При попытке специализировать такую функцию:
    Код (C):
    1.  
    2. template <typename T, typename U>
    3. inline U ValToStr(const T& Value);
    4.  
    5. template <typename T>
    6. inline std::string ValToStr<T, std::string>(const T& Value) {
    7.     std::ostringstream OutputStringStream;
    8.     OutputStringStream << Value;
    9.     return std::string(OutputStringStream.str());
    10. }
    11.  
    12. template <typename T>
    13. inline std::wstring ValToStr<T, std::wstring>(const T& Value) {
    14.     std::wostringstream OutputStringStream;
    15.     OutputStringStream << Value;
    16.     return std::wstring(OutputStringStream.str());
    17. }
    18.  
    19. ...
    20.  
    21. int main() {
    22.     std::string str1 = ValToStr<int, std::string>(123);
    23.     std::wstring str2 = ValToStr<int, std::wstring>(456);
    24. }
    25.  
    получаю ошибку на обоих специализированных реализациях:
    "error C2768: ValToStr: недопустимое использование явных аргументов шаблона".

    Как специализировать их правильно?
     
  2. f1redArk

    f1redArk Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    Частичная специализация шаблонов функций не допускается. Используйте шаблоны структур/классов:

    Код (C++):
    1.  
    2. #include <iostream>  
    3. #include <sstream>  
    4.    
    5. namespace internal {  
    6. template< typename T, typename U >  
    7. struct ValToStr;  
    8.    
    9. template< typename U >  
    10. struct ValToStr< std::string, U > {  
    11.   static inline std::string exec(const U& val) {  
    12.   std::ostringstream out_string_stream;  
    13.   out_string_stream << val;  
    14.   return out_string_stream.str();  
    15.   }  
    16. };  
    17.    
    18. template< typename U >  
    19. struct ValToStr< std::wstring, U > {  
    20.   static inline std::wstring exec(const U& val) {  
    21.   std::wostringstream out_string_stream;  
    22.   out_string_stream << val;  
    23.   return out_string_stream.str();  
    24.   }  
    25. };  
    26. }  
    27.    
    28. template< typename T, typename U >  
    29. inline T val_to_str(const U& val) {  
    30.   return internal::ValToStr< T, U >::exec( val );  
    31. }  
    32.    
    33. int main() {  
    34.   std::cout << val_to_str< std::string >(10) << std::endl;  
    35.   std::wcout << val_to_str< std::wstring >('a') << std::endl;  
    36. }
    37.                                                                              
    38.  
     
    Последнее редактирование: 13 ноя 2017