C2248好友功能错误

C2248 error with friend function

本文关键字:错误 功能 好友 C2248      更新时间:2023-10-16

我正在编写一个基本的<<操作符,所以我在类接口

中添加了友元函数
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'类中声明的受保护成员

实际上我已经修复了它,在操作符<<在实现文件上。我不明白的是为什么我必须这样做,即使在实现文件中,我使用了一个使用命名空间仓库::Dto指令?

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

如果你想在全局命名空间中为操作符定义合适的友元声明,可以这样做:

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

但是,您希望操作符与它正在流式传输的类位于相同的命名空间中。