Оператор шаблона C ++ не найден как соответствующий

Я пытаюсь создать генерала operator<< за std::ostream и любой тип Iterable.

Это код:

template <class T,template<class> class Iterable> inline std::ostream& operator<<(std::ostream& s,const Iterable<T>& iter){
s << "[ ";
bool first=false;
for(T& e : iter){
if(first){
first=false;
s << e;
}else{
s << ", " << e;
}
}
s << " ]";
return s;
}

К сожалению, мой оператор не найден в качестве соответствия для vector<uint> и компилятор пытается сопоставить с operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) ,

Любая идея, как я могу изменить перегрузку, чтобы быть распознанным?

7

Решение

Прямое решение вашей проблемы заключается в том, что vector это шаблон на два типы, а не один, так что вы хотели бы написать:

template <typename... T, template <typename... > class Iterable>
inline std::ostream& operator<<(std::ostream& os, const Iterable<T...>& iter)
{
s << "[ ";
bool first = true; // not false
for (const auto& e : iter) {
// rest as before
}
return s << " ]";
}

Это работает, но немного неудовлетворительно — поскольку некоторые вещи, которые являются шаблонами, не повторяемы, а некоторые вещи, которые не являются шаблонами, являются. Кроме того, нам на самом деле не нужно ни Iterable или же T в нашем решении. Так как насчет того, чтобы написать что-то, что берет любой Range — где мы определяем Range как нечто, имеющее begin() а также end():

template <typename Range>
auto operator<<(std::ostream& s, const Range& range)
-> decltype(void(range.begin()), void(range.end()), s)
{
// as above, except our container is now named 'range'
}

Если это тоже В общем, тогда вы можете сделать:

template <typename T> struct is_range : std::false_type;
template <typename T, typename A>
struct is_range<std::vector<T,A>> : std::true_type;
// etc.

template <typename Range>
typename std::enable_if<
is_range<Range>::value,
std::ostream&
>::type
operator<<(std::ostream& s, const Range& range)
4

Другие решения


По вопросам рекламы [email protected]