C++ C++;通用输出运算符重载 W类 { 私人: 长木瓜1,木瓜2; 公众: W(long&val1,long&val2):m_val1(val1),m_val2(val2){} 模板 friend std::ostream&operator

C++ C++;通用输出运算符重载 W类 { 私人: 长木瓜1,木瓜2; 公众: W(long&val1,long&val2):m_val1(val1),m_val2(val2){} 模板 friend std::ostream&operator,c++,generics,overloading,operator-keyword,output,C++,Generics,Overloading,Operator Keyword,Output,您已经创建了一个可以为所有类型调用的输出运算符,显然它应该只能用于W和X类。您需要缩小输出运算符函数的范围。编译器可以从调用中推断模板。因此,当您调用o时如何限制泛型函数和类模板的范围?@KokHowTeh一种方法是创建一个公共基类,并为该基类使用一个非模板化的输出运算符。或者您只需使用两个输出运算符,每个类一个。 class W { private: long m_val1, m_val2; public: W(long& val1, long& val2):m

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

编译器可以从调用中推断模板。因此,当您调用
o时如何限制泛型函数和类模板的范围?@KokHowTeh一种方法是创建一个公共基类,并为该基类使用一个非模板化的输出运算符。或者您只需使用两个输出运算符,每个类一个。
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;
}
template<class T>
std::ostream& operator<<(std::ostream& os, const string& obj)