未找到C模板运算符匹配

前端之家收集整理的这篇文章主要介绍了未找到C模板运算符匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个通用运算符<<对于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;
}

不幸的是,找不到我的运算符匹配向量< uint>并且编译器尝试与运算符<<(basic_ostream< _CharT,_Traits>&& __ os,const _Tp& __x)匹配.

知道我怎么能改变过载被识别?

解决方法

你问题的直接解决方案是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)

猜你在找的C&C++相关文章