gpt4 book ai didi

c++ - 签名输出运算符重载

转载 作者:搜寻专家 更新时间:2023-10-31 00:22:54 25 4
gpt4 key购买 nike

你知道如何在 C++ 中为模板类的 operator<< 编写函数或方法的签名吗?我想要这样的东西:


template <class A> class MyClass{
public:
friend ostream & operator<<(ostream & os, MyClass<A> mc);
}
ostream & operator<<(ostream & os, MyClass<A> mc){
// some code
return os;
}
但这只是无法编译。有谁知道怎么写才正确?

最佳答案

下面都说了,如果你不需要运营商成为 friend ,那就不要成为 friend 。特别是对于输出运算符(operator),我认为你不应该让他们成为 friend 。那是因为如果你的类可以输出到流,它应该有等效的 get以编程方式提供相同数据的函数。在那种情况下,你可以写一个 operator<<作为那些非 friend get功能。

如果你有充分的理由让他们成为 friend ,你可以做一个 friend 定义

template <class A> class MyClass {
public:
friend ostream & operator<<(ostream & os, MyClass<A> const& mc) {
// ...
}
};

这样你就不需要 template<...>使您获得类型的子句 A .如果您在模板中定义运算符,这是已知的。请注意,即使您在模板中定义了它,它也不是成员函数。它仍然是非成员,但可以访问类中声明的名称(如模板参数)。对于 MyClass 的每个实例你创建一个不同的非模板运算符函数是从那个打印东西的 friend 函数中创建的。

如果你想在外部定义模板,你必须预先声明它才能将它的给定特化声明为友元。

// predeclare it so you can make it a friend.
template <class A> class MyClass;
template <class A> ostream &operator<<(ostream &os, MyClass<A> const&);

template <class A> class MyClass{
public:
/* the "<A>" is needed - it says that a given instantiation of
that template is a friend, and not a non-template function. */
friend ostream & operator<< <A>(ostream & os, MyClass<A> const& mc);
};

template <class A>
ostream & operator<<(ostream & os, MyClass<A> const& mc){
// some code
return os;
}

这使得 operator<< <Foo> MyClass<Foo>的 friend .如果您要省略 <A>或者也可能是空的 <> ,编译器会理解为您创建了一个非模板运算符,它具有具体参数而不是模板化参数作为友元。

更简单但不太“正确”的解决方案是制作 MyClass <Foo>有所有的 friend operator <<实例化。所以理论上operator << <Bar>可以访问 MyClass <Foo> 的私有(private)成员.这不是我们想要的,但它也有效,获得了比需要更多的访问权限。它摆脱了前向声明的需要:

template <class A> class MyClass{
public:
/* make all instantiations friends. */
template<typename T>
friend ostream & operator<<(ostream & os, MyClass<T> const& mc);
};

template <class T>
ostream & operator<<(ostream & os, MyClass<T> const& mc){
// some code
return os;
}

关于c++ - 签名输出运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2753590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com