未找到C模板运算符匹配

未找到C模板运算符匹配,第1张

概述我正在尝试创建一个通用运算符<<对于std :: ostream和任何Iterable类型. 这是代码: template <class T,template<class> class Iterable> inline std::ostream& operator<<(std::ostream& s,const Iterable<T>& iter){ s << "[ "; bool 我正在尝试创建一个通用运算符<<对于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&>::typeoperator<<(std::ostream& s,const Range& range)
总结

以上是内存溢出为你收集整理的未找到C模板运算符匹配全部内容,希望文章能够帮你解决未找到C模板运算符匹配所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1239644.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存