【发布时间】:2011-03-03 03:13:27
【问题描述】:
考虑以下代码:
class MyClass
{
template <typename Datatype>
friend MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData);
// ...
};
template <typename Datatype>
MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData)
{
// ...
}
我怎样才能在类中定义operator<<内部,而不是作为友元函数?像这样的:
class MyClass
{
// ...
public:
template <typename Datatype>
MyCLass& operator<<(MyClass& MyClassReference, Datatype SomeData)
{
// ...
}
};
上面的代码会产生编译错误,因为它接受两个参数。删除 MyClassReference 参数可修复错误,但我有依赖于该参数的代码。 MyClassReference 是否仅相当于 *this?
【问题讨论】:
-
MyClass是采用DataType类型参数的模板吗? -
@大卫不;出于演示目的,
Datatype用于代替实际类型。 -
@Maxpm:那你为什么要在看起来像是定义的地方添加
template?您正在声明一个朋友函数,但定义一个模板,它是一个不同的野兽,因此不是朋友。 -
@David 所以插入操作符可以接受任何类型的输入。
-
然后成为模板,而不是函数。
template <typename T> void foo( T );是模板,void foo( int );是函数,f(1)是对非模板函数的调用,f<int>(5)是对模板函数的调用。它们是不同的东西,因此您不能与其中一个成为朋友并期望另一个可以访问。我在下面添加了一个答案。如果这还不够清楚,请告诉我,我会尝试扩展它。
标签: c++ oop class operator-overloading friend-function