2014-12-30 3 views
0

Я использую Visual Studio в моем SLn существуют некоторые проекты: Общие, Трейдергде добавить переопределения оператора << для перечислений

В Common я имею в пространстве имен Helper

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){ 
..... 
} 

Но я не знаю, где, чтобы добавить код оператора.

В общем проекте монеты перечисление не существует, а если добавить оператор в проекте Trader я получаю ошибку ссылки unresolve внешнего

+1

Не писать такой код на C++, это Java-ism. Ваши функции 'static' должны быть функциями вне классов. Это также позаботится о вашей проблеме определения оператора потоковой передачи. –

+0

Является ли определение вашего оператора внутри пространства имен Market? Число рейнольдса предыдущий комментарий: если статические методы принадлежат классу, они должны быть определены в этом классе, чтобы закодировать в общем объектно-ориентированном виде (за исключением операторов, которые по общему соглашению определены в способе herzl). Но это зависит от предпочтений кодера. – dwn

+0

Кроме того, если вы добавляете его в .h, он должен быть встроенным. – dwn

ответ

0

При реализации оператора для определенного типа пользователя вы должны реализовать его в пути, где ADL (зависящий от аргументов поиск) может их найти. ADL находит функции в пространствах имен, связанных с аргументами функции. Поскольку единственным пространством имен, связанным с оператором вывода, является пространство имен std и пространство имен, в котором определяется определяемый пользователем тип. Поскольку вам не разрешено добавлять что-либо в пространство имен std, пространство имен определяемого пользователем типа является единственным вариантом.

Смежные вопросы