我有一个包含一个类的命名空间,它应该模仿堆栈的功能,我有一个打印功能和一个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')” 我很困惑,因为我的打印功能完美无缺,我的重载只是调用函数不应该工作相同?
答案 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
中。