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

C++ generic output operator overload

本文关键字:重载 运算符 输出 泛型 C++      更新时间:2023-10-16
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:'操作<<'不明确",只要使用"cout <<"某个字符串";"。

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

编译器可以从调用中推断出模板。所以当你调用os << "m_val1: "时,基于你的模板实现,它会创建

template<class T>
std::ostream& operator<<(std::ostream& os, const string& obj)

女巫已经存在了。有关 http://accu.org/index.php/journals/409 中模板参数推导的详细信息