message: GCC compilation fix
diff: @@ -38,17 +38,42 @@ inline void convertEncoding(
  namespace value_manip {
  - template <typename> struct from_application; // Leave unimplemented for general case.
  - template <typename> struct from_driver; // Leave unimplemented for general case.
  - template <typename> struct from_data_source; // Leave unimplemented for general case.
  + template <typename SourceType>
  + struct from_application {
  + template <typename DestinationType>
  + struct to_driver {
  + static inline void convert(const SourceType & src, DestinationType & dest); // Leave unimplemented for general case.
  + };
  + };
  - template <typename SourceCharType>
  - struct from_application<SourceCharType *> { // SQLCHAR or SQLWCHAR
  - template <typename> struct to_driver; // Leave unimplemented for general case.
  + template <typename SourceType>
  + struct from_driver {
  + template <typename DestinationType>
  + struct to_application {
  + static inline void convert(const SourceType & src, DestinationType & dest); // Leave unimplemented for general case.
  + };
  - template <>
  - struct to_driver<std::basic_string<DriverPivotNarrowCharType>> {
  - using DestinationType = std::basic_string<DriverPivotNarrowCharType>;
  + template <typename DestinationType>
  + struct to_data_source {
  + static inline void convert(const SourceType & src, DestinationType & dest); // Leave unimplemented for general case.
  + };
  + };
  +
  + template <typename SourceType>
  + struct from_data_source {
  + template <typename DestinationType>
  + struct to_driver {
  + static inline void convert(const SourceType & src, DestinationType & dest); // Leave unimplemented for general case.
  + };
  + };
  +
  + template <typename SourceCharType> // SQLCHAR or SQLWCHAR
  + struct from_application<SourceCharType *> {
  + template <typename DestinationType>
  + struct to_driver {
  +
  + // Not allowed to specialize a member template of a partially specialized class, so perform this check instead.
  + static_assert(std::is_same_v<DestinationType, std::basic_string<DriverPivotNarrowCharType>>);
  template <typename ConversionContext = DefaultConversionContext>
  static inline void convert(const std::basic_string_view<SourceCharType> & src, DestinationType & dest, ConversionContext && context = ConversionContext{}) {
  @@ -123,10 +148,21 @@ namespace value_manip {
  template <>
  struct from_driver<std::basic_string<DriverPivotNarrowCharType>> {
  - template <typename> struct to_application; // Leave unimplemented for general case.
  + using SourceType = std::basic_string<DriverPivotNarrowCharType>;
  +
  + template <typename DestinationType>
  + struct to_application {
  + static inline void convert(const SourceType & src, DestinationType & dest); // Leave unimplemented for general case.
  + };
  - template <typename DestinationCharType>
  - struct to_application<DestinationCharType *> { // SQLCHAR or SQLWCHAR
  + template <typename DestinationType>
  + struct to_data_source {
  + static inline void convert(const SourceType & src, DestinationType & dest); // Leave unimplemented for general case.
  + };
  + };
  +
  + template <typename DestinationCharType> // SQLCHAR or SQLWCHAR
  + struct from_driver<std::basic_string<DriverPivotNarrowCharType>>::to_application<DestinationCharType *> {
  using DestinationType = std::basic_string<DestinationCharType>;
  template <typename ConversionContext = DefaultConversionContext>
  @@ -188,7 +224,6 @@ namespace value_manip {
  return convert(make_string_view(src, static_cast<std::size_t>(src_length)), dest, std::forward<ConversionContext>(context));
  }
  };
  - };
  } // namespace value_manip
  