Почему этот сценарий шаблона c ++ не может быть скомпилирован: - PullRequest
0 голосов
/ 29 апреля 2020
struct stream_type1 {
  template<typename T>
  const T& read() const;
};

struct stream_type2 {
  template<typename T>
  const T& read() const;
};

template<typename S, typename T>
const T& stream_read(const S& stream)
{
  return stream.read<T>();
}

// example:
stream_type1 stream1;
stream_type1 stream2;

int value1 = stream_read<int>(stream1);
int value2 = stream_read<int>(stream2);

ошибка: C2665: 'stream_read': ни одна из двух перегрузок не может преобразовать все типы аргументов

, поэтому я должен специализировать шаблон ведьмы делает его излишним

template<typename T>
const T& stream_read(const stream_type1 & stream)
{
  return stream.read<T>();
}

template<typename T>
const T& stream_read(const stream_type2 & stream)
{
  return stream.read<T>();
}

1 Ответ

3 голосов
/ 29 апреля 2020

У вас неверные параметры вашего шаблона для определения типа потока. На данный момент вы создали его как

template<typename T>
const T& stream_read(const int& stream)
{
  return stream.read<T>();
}

Вы можете поменять местами T и S

template<typename T, typename S>
const T& stream_read(const S& stream)
{
  return stream.read<T>();
}
...