2013-04-02 54 views
1

我寫了< <運營商的基本超負荷所以我添加了一個友元函數的類接口C2248錯誤

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'中聲明的受保護成員

實際上,我已經修復了它,將名稱空間之前的運營商< <上的實施文件。 我不明白的是爲什麼我必須這樣做,即使在執行文件中我已經使用使用命名空間Warehouse :: Dto指令?

+1

可能重複的[未解析的外部符號的朋友功能](http://stackoverflow.com/questions/15430665/unresolved-external-symbol-for-friend-function) – Angew

+0

可能重複的[C++的朋友功能不能訪問私人會員](http://stackoverflow.com/questions/15731414/c-friend-function-cant-access-private-members) –

回答

2

因爲在全局命名空間中定義了operator <<,並且在Warehouse::Dto命名空間中定義了AbstractOrder類。但是,朋友聲明是針對Warehouse::Dto命名空間中的流操作符。

如果要定義合適的朋友聲明在全局命名空間的運營商將是:

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

但話又說回來你想要的操作者住在同一個命名空間,因爲它是流的類。

+0

我明白了。感謝您的解釋! – mattneri

相關問題