[英]error when trying to overload << operator and using friend function
我试图重载<<运算符,并使用朋友功能。 下面的代码块工作正常。
template <class T>
class Mystack{
friend std::ostream& operator<<(std::ostream& s, Mystack<T> const& d)
{
d.print(s);
return s;
}
};
由于它是朋友函数,我显然希望在类之外定义它而不使用范围解析运算符。 但是当我尝试时,我得到了错误。
template <class T>
class Mystack{
friend std::ostream& operator<<(std::ostream& s, Mystack<T> const& d);
};
template <class T>
std::ostream& operator<<(std::ostream& s, Mystack<T> const& d)
{
d.print(s);
return s;
}
以下是main的代码段
Mystack<int> intstack;
std::cout << intstack;
错误 :外部符号未解析。
PS:它不是完整的运行代码。 只是一个样本。 请忍受。
friend std::ostream& operator<<(std::ostream& s, Mystack<T> const& d);
声明非模板operator<<
函数并与之成为朋友。 因此Mystack<int>
将具有一个非模板函数std::ostream& operator<<(std::ostream& s, Mystack<int> const& d);
作为其朋友std::ostream& operator<<(std::ostream& s, Mystack<int> const& d);
等
template<class T>
std::ostream& operator<<(std::ostream& s, Mystack<T> const& d)
{
d.print(s);
return s;
}
定义一个operator<<
功能模板。
两者不一样。 当你写std::cout << intstack;
,重载解析规则会将其解析为您声明的非模板operator<<
函数,但未定义该函数,因此会出现链接器错误。
无法为类模板之外的每个类模板实例化定义非模板函数。 但是,您可以成为您的operator<<
功能模板的专业人士的朋友:
// forward declarations
template <class T>
class Mystack;
template <class T>
std::ostream& operator<<(std::ostream& s, Mystack<T> const& d);
template <class T>
class Mystack
{
friend std::ostream& operator<< <T>(std::ostream& s, Mystack<T> const& d);
// ^^^
};
或与功能模板的每个专业化做朋友,这从封装的角度来看更糟(因为,例如, operator<< <int>
将是Mystack<float>
的朋友):
template <class T>
class Mystack
{
public:
template <class U>
friend std::ostream& operator<<(std::ostream& s, Mystack<U> const& d);
};
或者只是在类中定义friend函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.