2010-01-16 3 views
2

내 질문에 관련 bit가 this입니다.템플릿 정의의 친구 기능

내가 어떤 클래스의 연산자 < <를 오버로드 할 내가 모두 일 두 개의 서로 다른 표기법 발견

template <class T> 
class A{ 
    T t; 
public: 
    A(T init) : t(init){} 
    friend ostream& operator<< <> (ostream &os, const A<T> &a); //need forward declaration 
    //template <class U> friend ostream& operator<< (ostream &os, const A<U> &a); 
}; 

내가 다른 표기법과 동일한 일을 정의 하는가? 또는 첫 번째 버전이 < < 인 인스턴스 (이 경우 클래스 A와 동일한 T를 가진 인스턴스 만)가 A의 친구 일 때 더 제한적입니까? 두번째는 A<SomeType> 친구 걸리는 어떤 operator<<하게하면서

답변

1

첫 번째 버전은 특정 유형 A<T> 대한 operator<<로 친구를 제한한다.

그래서 네, 첫 번째는 더 제한 :

template<class T> 
ostream& operator<< (ostream& os, const A<T>& a) { 
    A<double> b(0.0); 
    b.t; // compile error with version 1, fine with version 2 
    return os; 
} 

int main() { 
    A<int> a(0); 
    cout << a << endl; 
} 
+0

몇 가지. 첫째, 소유 된 멤버 변수를 출력하려면 'os << b.i'가 아닌 'os << b.t'를 의미한다고 생각합니다. 둘째, 위의 예제는 선언 된 템플릿 버전이 아니라 'ostreame & operator << (ostream & os, double num)'함수를 사용하는 연산자 << 인스턴스로 잘 작동합니다. – workmad3

+0

나는 어딘가에는 내 머리를 가졌지 만, 평균 시간에는 고정시켰다. –

0

너무 친구 기능의 정의 템플릿에 대한 예외를 가지고 발생합니다.

template <class T> 
class A{ 
    T t; 
public: 
    A(T init) : t(init){} 
    friend ostream& operator<<(ostream &os, const A &a) 
    { // Implementation in the class 
    } 
}; 

을 그리고 그것은 자동으로 생성 A<T>의 각 인스턴스에 대해 생성 된 정상적인 기능을 만드는 장점이 있습니다 : 그것은 당신이를 작성할 수 있습니다.

참조 용 : http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16

+0

"예외"라고 말하면 연산자 정의에 A 을 쓸 필요가 없다는 뜻입니까? 내 질문 : 정말 이점이 있습니까? 좋아, 당신은 <<의 템플릿 버전을 가지고 있지 않지만 위의 경우 특정 클래스와 함께 어딘가에서 사용되는 경우 <<에 대한 템플릿 인스턴스가 생성됩니다. – haselhorstk

+0

주요 장점은 앞으로 선언 할 필요가 없다는 것입니다. 항상 모든 클래스에서 정의해야합니다. –

+0

진정한 장점은 함수 템플릿을 전혀 정의하지 않는다는 것입니다. 따라서 강압과 같은 관련 문제는 없습니다. – PierreBdR