我需要创建一个这样的重载运算符,它仅适用于预定义类型(例如,使用 ofstream,stringstream ,但不能使用 ostream & ; iostream ) 。这是一个例子:
// Possible usage: class Test : public BinaryTemplate - now you can simply write&read class Test from/to a file
class BinaryTemplate
{
public:
template <typename K>
// friend std::ostream& operator << (std::ostream&, K const&); // LINKER ERROR 2019
friend std::ios& operator << (std::ios&, K const&); // OK
}
template <typename Stream, typename K>
Stream& operator << (Stream& out, K const& c)
{
out.write(reinterpret_cast<const char*>(&c), sizeof(K));
out.flush();
return out;
}
BinaryTemplate bt;
cout << bt; // LINKER ERROR 2019 or OK
编译器的行为很奇怪(我希望理解清楚
根据评论错误)。当我声明像<ios>
这样的朋友方法时,它是正常的,因为cout
对象是ostream
的实例,它来自ios
。但是当我声明像<ostream>
这样的朋友方法时它会导致LINKER ERROR,但是cout
对象是ostream
的实例,那么LINKER ERROR会引起很奇怪。
所以,我的问题是:
为什么链接器有这样的行为?我应该如何创建只使用预定义类型的类方法?
非常感谢