如何创建仅适用于C ++中预定义类型的方法?

时间:2015-06-10 08:06:06

标签: c++ templates typetraits

我需要创建一个这样的重载运算符,它仅适用于预定义类型(例如,使用 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会引起很奇怪。 所以,我的问题是:

为什么链接器有这样的行为?我应该如何创建只使用预定义类型的类方法?

非常感谢

0 个答案:

没有答案