C ++泛型输出运算符重载

时间:2013-01-21 11:12:11

标签: c++ generics overloading operator-keyword output

class W
{
private:
    long m_val1, m_val2;
public:
    W(long& val1, long& val2):m_val1(val1), m_val2(val2) {}
    template<class T>
    friend std::ostream& operator<<(std::ostream& os, const T& w);
};

class X
{
private:
    long m_val1, m_val2;
public:
    X(const long& val1, long& val2):m_val1(val1), m_val2(val2) {}
    template<class T>
    friend std::ostream& operator<<(std::ostream& os, const T& x);
};

template<class T>
std::ostream& operator<<(std::ostream& os, const T& obj)
{
    os << "m_val1: " << obj.m_val1 << ", m_val2: " << obj.m_val2 << endl;
}

它不起作用。任何人都可以指出我错过了什么?谢谢。 另外,这导致“错误C2593:'操作&lt;&lt;&lt;是不明确的“在哪里”cout&lt;&lt;“某些字符串”;“使用。

2 个答案:

答案 0 :(得分:2)

您已经创建了一个可以为所有类型调用的输出运算符,很明显它应该只能用于WX类。您需要缩小输出操作符函数的范围。

答案 1 :(得分:0)

编译器可以从调用中推断出模板。因此,当您根据模板实施调用os << "m_val1: "时,会创建

template<class T>
std::ostream& operator<<(std::ostream& os, const string& obj)
巫婆已经存在了。有关http://accu.org/index.php/journals/409

中模板参数推导的更多信息