2011-03-03 71 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) 
    { 
     // ... 
    } 
};