未找到C模板运算符匹配

前端之家收集整理的这篇文章主要介绍了未找到C模板运算符匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个通用运算符<<对于std :: ostream和任何Iterable类型. 这是代码
  1. template <class T,template<class> class Iterable> inline std::ostream& operator<<(std::ostream& s,const Iterable<T>& iter){
  2. s << "[ ";
  3. bool first=false;
  4. for(T& e : iter){
  5. if(first){
  6. first=false;
  7. s << e;
  8. }else{
  9. s << "," << e;
  10. }
  11. }
  12. s << " ]";
  13. return s;
  14. }

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

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

解决方法

你问题的直接解决方案是vector是两种类型的模板,而不是一种,所以你想写:
  1. template <typename... T,template <typename... > class Iterable>
  2. inline std::ostream& operator<<(std::ostream& os,const Iterable<T...>& iter)
  3. {
  4. s << "[ ";
  5. bool first = true; // not false
  6. for (const auto& e : iter) {
  7. // rest as before
  8. }
  9. return s << " ]";
  10. }

这是有效的,但有点不满意 – 因为一些模板的东西是不可迭代的,而有些东西不是模板.此外,在我们的解决方案中,我们实际上不需要Iterable或T.那么我们如何写一些带有任何Range的东西 – 我们将Range定义为具有begin()和end()的东西:

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

如果这太笼统了,那么你可以这样做:

  1. template <typename T> struct is_range : std::false_type;
  2. template <typename T,typename A>
  3. struct is_range<std::vector<T,A>> : std::true_type;
  4. // etc.
  5.  
  6. template <typename Range>
  7. typename std::enable_if<
  8. is_range<Range>::value,std::ostream&
  9. >::type
  10. operator<<(std::ostream& s,const Range& range)

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