我正在编写<<的基本重载运算符所以我在类接口
中添加了一个友元函数namespace Warehouse
{
namespace Dto
{
class Product;
class AbstractOrder : public ICloneableItem
{
protected:
unsigned long _id;
std::string _name;
std::vector<Product*> _products;
public:
AbstractOrder();
virtual ~AbstractOrder();
double computePrice() const;
void addProduct(Product* product);
void removeProduct(Product* product);
void removeAllProducts();
void setName(const std::string& name) { _name = name; }
std::string getName() const { return _name; }
unsigned long getId() const { return _id; }
std::vector<Product*> getProductList() const { return _products; }
friend std::ostream& operator<<(std::ostream& os, const AbstractOrder& ord);
};
}
}
在实现文件中,这是函数的代码
using namespace Warehouse::Dto;
....
std::ostream& operator<<(std::ostream& os, const AbstractOrder& ord)
{
os << "[" << ord._id << "] Order " << ord._name << ": " << ord.computePrice();
return os;
}
为什么我收到以下错误? 错误1错误C2248:'Warehouse :: Dto :: AbstractOrder :: _ id':无法访问类'Warehouse :: Dto :: AbstractOrder'中声明的受保护成员
实际上我已经修复了它,在运算符&lt;&lt;&lt;&lt;&lt;在实施文件上。 我不明白为什么我必须这样做,即使在实现文件中我使用了使用命名空间Warehouse :: Dto 指令?
答案 0 :(得分:2)
因为operator <<
在全局命名空间中定义,AbstractOrder
类在Warehouse::Dto
命名空间中定义。但是友元声明是针对Warehouse::Dto
命名空间中的流操作符。
如果要在全局命名空间中为运算符定义正确的友元声明,则为:
friend std::ostream& ::operator<<(std::ostream& os, const AbstractOrder& ord);
但是再一次,您希望运算符与其流式传输的类位于同一名称空间中。