2011-03-03 79 views
0

考虑下面的代码:定义操作符<<课内

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

+0

是'MyClass'的模板,需要一个'DataType'类型参数? – 2011-03-03 08:42:29

+0

@David No;为了演示目的,使用“数据类型”代替实际类型。 – Maxpm 2011-03-03 17:27:25

+0

@Maxpm:那么为什么你在似乎是一个定义中添加了'template'?你正在声明一个朋友函数,但是定义了一个不同于野兽的模板,因此不是朋友。 – 2011-03-03 19:41:09

回答

1

你有

template <typename Datatype> MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData); 

类的内部。它是类MyClass的一种方法。非静态方法有一个隐式参数,称为this指针。 this指针是指向调用方法的对象的指针。您不需要参数MyClassReference,因为this指针可以满足此目的。

更改该方法声明

template <typename Datatype> MyClass& operator<<(Datatype SomeData); 

1

我不确定这是个好主意,但是 - 当您将operator<<定义为成员函数时,*this将基本上等同于您在运算符中定义的第一个参数。

+0

-1错误。 'operator <<'不仅适用于流。它只是一个操作员。他正在为他的类写一个插入操作符,将类型为“Datatype”的对象插入到类“MyClass”的对象中。 – 2011-03-03 03:21:11

+0

@Sion Sheevok:是的 - 我意识到他之前在编辑之前正在编辑的内容(它只是在发布之后才发布的)。 – 2011-03-03 03:28:57

0

你几乎有:

class MyClass 
{ 
    template <typename Datatype> 
    friend MyClass& operator<<(MyClass& MyClassReference, Datatype SomeData) 
    { 
     // ... 
    } 
};