2014-12-30 48 views
0

我使用Visual Studio在我的SLN存在的一些項目:普通,交易在哪裏添加越權操作者對<<枚舉

在公共我在命名空間助手

namespace Helper{ 
    template<T> 
    class Print{ 
     template<T> 
     static PrintEnum(std::ostream &os, const std::string& prefix,const T& val){ 
      os << prefix << ":" << val; 
     } 
    }; 
} 

,並在工程商類打印存在一定的枚舉文件Typedef.h象下面這樣:

namespace Market{ 
    enum Coin{USD,JPY,EUR}; 
} 

和存在功能打印類平臺象下面這樣:

namespace Market{ 

    void Platform::PrintTheBest(std::ostream &os){ 
     Coin best = USD; 
     Helper::Print::PrintEnum(os, std::string("Best"),best); 
    } 
} 

我要重寫< <打印枚舉硬幣象下面這樣:

std::ostream& operator<<(std::ostream& , const Coin& coin){ 
..... 
} 

但我不知道在哪裏添加的運營商代碼。

在共同的項目硬幣枚舉不存在的,如果我在交易項目中添加了運營商,我得到的鏈接錯誤unresolve外部

+1

不要這樣寫C++代碼,它是一個Java-ISM。你的靜態成員函數應該是類之外的函數。這也可以解決您在何處定義流式運算符的問題。 –

+0

您的運算符是否在名稱空間市場中定義?回覆。前面的評論:如果靜態方法屬於一個類,它們應該在該類中定義,以通用的面向對象的方式進行編碼(運算符除外,按照慣例,這是按照herzl的方式定義的)。但這取決於編碼人員的偏好。 – dwn

+0

此外,如果您將其添加到.h中,它應該是內聯的。 – dwn

回答

0

當實現爲用戶定義類型的運營商需要實現它的方式,其中ADL(依賴於參數的查找)可以找到它們。 ADL在與函數參數關聯的名稱空間中查找函數。由於與輸出運算符有關的唯一名稱空間是名稱空間std和用戶定義類型定義的名稱空間。由於您不允許向命名空間std添加任何內容,因此用戶定義類型的命名空間是唯一選項。