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;“某些字符串”;“使用。
答案 0 :(得分:2)
您已经创建了一个可以为所有类型调用的输出运算符,很明显它应该只能用于W
和X
类。您需要缩小输出操作符函数的范围。
答案 1 :(得分:0)
编译器可以从调用中推断出模板。因此,当您根据模板实施调用os << "m_val1: "
时,会创建
template<class T>
std::ostream& operator<<(std::ostream& os, const string& obj)
巫婆已经存在了。有关http://accu.org/index.php/journals/409 中模板参数推导的更多信息