2

我正在编写 << 运算符的基本重载,因此我在类接口中添加了一个友元函数

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”中声明的受保护成员

实际上我已经修复了它,在实现文件上的 operator<< 之前添加了命名空间。我不明白为什么即使在实现文件中我使用了using namespace Warehouse::Dto指令,我也必须这样做?

4

1 回答 1

2

因为operator <<是在全局命名空间中定义的,而AbstractOrder类是在Warehouse::Dto命名空间中定义的。但是朋友声明是针对Warehouse::Dto命名空间中的流操作符的。

如果要在全局命名空间中为运算符定义正确的友元声明,则为:

friend std::ostream& ::operator<<(std::ostream& os, const AbstractOrder& ord);

但话又说回来,您希望操作员与它正在流式传输的类位于相同的命名空间中。

于 2013-04-02T13:19:14.177 回答