2014-12-30 45 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添加任何内容,因此用户定义类型的命名空间是唯一选项。