1
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 << “some string”;” 用来。

4

2 回答 2

2

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

于 2013-01-21T11:16:15.067 回答
0

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

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

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

于 2013-01-21T11:27:00.587 回答