c ++ 11 ambiguous<<超载

时间:2018-02-21 17:42:14

标签: c++ c++11

我有一个包含一个类的命名空间,它应该模仿堆栈的功能,我有一个打印功能和一个out stream重载,调用print函数打印出我的vector的模板内容stack.h文件我将这些功能定义为

namespace foo
{
   template <typename T>
   class Stack{
      public:
         //...
         void print(std::ostream& os,char ofs = ' ');
         //...
      private:
         std::vector<T> stack;
   };

   template <typename T>
   std::ostream&  operator<<(std::ostream& os, const Stack<T>& A);
}

并在我的stack.hpp文件中

template<typename T>
void foo::Stack<T>::print(std::ostream& os, char ofc)
{
   for(auto itr = stack.begin(); itr != stack.end(); ++itr)
   {
      os << *itr << ofc;
   }
}

template<typename T>
std::ostream& foo::operator<<(std::ostream& os, const Stack<T>& A)
{
   A.print(os);
   return os;
}

然后在我的stack.cpp驱动程序中我创建一个堆栈对象“b”并用整数填充它并调用.stack :: print函数并打印出具有ofc填充字符的元素inbetween但是当我调用cout&lt时;&LT; b;编译器抱怨运算符&lt;&lt;重载说是“操作数类型是'std :: ostream {aka std :: basic_ostream}'和'this :: Stack')” 我很困惑,因为我的打印功能完美无缺,我的重载只是调用函数不应该工作相同?

1 个答案:

答案 0 :(得分:0)

你试过

吗?
<amp-ad
  width="300"
  height="250"
  type="doubleclick"
  data-slot="/35096353/amptesting/image/static">
</amp-ad>

我的意思是......你已经在命名空间namespace foo { template<typename T> void Stack<T>::print(std::ostream& os, char ofc) { for(auto itr = stack.begin(); itr != stack.end(); ++itr) { os << *itr << ofc; } } template<typename T> std::ostream& operator<<(std::ostream& os, const Stack<T>& A) { A.print(os); return os; } } 中定义了operator<<(std::ostream &, const Stack<T> &)但是当你使用它时

foo

您在命名空间template<typename T> void foo::Stack<T>::print(std::ostream& os, char ofc) { for(auto itr = stack.begin(); itr != stack.end(); ++itr) { os << *itr << ofc; } } 中定义的方法中,但您不在命名空间foo中。