cou*_*ech 2 c++ templates operator-overloading
你知道吗,如何在C++中为operator << for template class写一个函数或方法的签名?我想要的东西:
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;
}
但这只是不会编译.有谁知道,怎么写得正确?
以下所述,如果你不需要操作员成为朋友,那么就不要把它变成朋友.特别是对于输出操作员,在我看来,你不应该让他们成为朋友.这是因为如果您的类可以输出到流,它应该具有get以编程方式提供相同数据的等效函数.在那种情况下,你可以operator<<根据这些get功能写一个非朋友.
如果你有充分的理由让他们成为朋友,你可以做朋友定义
template <class A> class MyClass {
public:
friend ostream & operator<<(ostream & os, MyClass<A> const& mc) {
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
这样你就不需要template<...>让你获得类型的子句A.如果你在模板中定义运算符,我们知道这一点.请注意,即使您在模板中定义了它,它也不是成员函数.它仍然是非成员,但可以访问类中声明的名称(如模板参数).对于MyClass您创建的每个实例,将从打印内容的友元函数创建不同的非模板操作符函数.
如果要在外部定义模板,则必须预先声明它以便能够将其作为朋友声明给定的特化.
// 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;
}
Run Code Online (Sandbox Code Playgroud)
这使得他operator<< <Foo>的朋友MyClass<Foo>.如果你要省略<A>或者也可能是空的<>,编译器会理解,你说你创建了一个非模板操作符,具有具体而不是模板化的参数作为朋友.
更容易但不太"正确"的解决方案是让MyClass <Foo>所有operator <<实例成为朋友.因此理论上operator << <Bar>可以访问私人成员MyClass <Foo>.这不是想要的东西,但它也有效,获得了比需要更多的访问权限.它摆脱了向前声明的需要:
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;
}
Run Code Online (Sandbox Code Playgroud)