2011-03-03 12 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

가의''DataType' 형의 인수를 취하는 템플릿을 MyClass' 있습니까? –

+0

@ David 's No; '데이터 유형'은 데모 목적으로 실제 유형 대신 사용되었습니다. – Maxpm

+0

@ Maxx : 그렇다면 왜 '템플릿'을 정의에 추가 했습니까? 친구 함수를 선언하고 있지만 다른 짐승과 같은 친구가 아닌 템플릿을 정의합니다. –

답변

1

당신은 클래스의 내부

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

있습니다. 클래스 MyClass의 메소드입니다. 비 정적 메서드에는 포인터라는 암시 적 매개 변수가 있습니다. this 포인터는 메서드가 호출 된 개체에 대한 포인터입니다. MyClassReference 매개 변수는 this 포인터가 해당 목적을 충족하므로 필요하지 않습니다.

변경 메소드 선언에

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

.

1

잘 모르겠지만 예 - operator<<을 멤버 함수로 정의하면 *this은 본질적으로 연산자에서 정의한 첫 번째 매개 변수와 같습니다.

당신은 거의 있었다
+0

-1 잘못된 것입니다. 'operator <<'는 스트림을위한 것이 아닙니다. 그것은 단순히 연산자입니다. 그는 효과적으로 클래스의 삽입 연산자를 작성하여 클래스 'MyClass'의 객체에'Datatype'유형의 객체를 삽입합니다. –

+0

@ 시온 세곡 (Shion Sheevok) : 예 - 나는 당신이 논평하기 전에 그가 무엇을 알고 있었는지 깨달았습니다. –

0

:

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