朋友功能C2248错误

时间:2013-04-02 13:13:20

标签: c++ visual-c++

我正在编写<<的基本重载运算符所以我在类接口

中添加了一个友元函数
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 指令?

1 个答案:

答案 0 :(得分:2)

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

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

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

但是再一次,您希望运算符与其流式传输的类位于同一名称空间中。