C2248好友功能错误
C2248 error with friend function
我正在编写一个基本的<<操作符,所以我在类接口
中添加了友元函数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);
但是,您希望操作符与它正在流式传输的类位于相同的命名空间中。
相关文章:
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在气泡排序程序中未声明错误功能
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 访问我以前可以访问的功能时出现分段错误
- 分割错误:向量中的擦除功能
- 如何组织 git 工作流以修复错误并同时引入新功能
- 错误:当我尝试使用引用时,使用已删除的功能
- 错误:调用'strcmp'没有匹配函数(尝试设置显示用户信息功能)
- 这种错误的原因是什么:将"功能"重新定义为不同类型的符号
- Boost进程"系统"功能中的错误处理
- 为什么我的删除功能总是出现分段错误
- 想要构建一些必要的库来检测功能.出现一些错误
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- Visual C:命名空间范围错误或晦涩功能?
- C++插入排序错误功能不起作用
- 错误功能出现问题
- 使用VideoWriter_GPU时如何解决OpenCV错误"功能未实现(当前构建或平台禁用了称为功能)?