2014-12-11 4 views
1

나는 템플릿 인자 my_class<U> (일반적으로 다른 템플릿 인자를 가짐)을받는 템플릿 클래스 my_class<T>을 가지고있다. 템플릿이없는 코드 또는 동일한 템플릿 매개 변수와 달리 my_class<U> 인스턴스 개인 필드에 액세스 할 수는 없지만 동일한 클래스입니다.다른 템플릿 인자를 가진 동일한 클래스는 서로의 private 필드에 접근 할 수 없다.

template <class T> 
class my_class { 

    private:    
     T * data; 

    public: 
     template <class U> 
     my_class(const my_class<U> & p) { 
      data = p.data; // <-- visibility exposing 
     } 
} 

가능한가요? 어쩌면 다른 템플릿 인수로 친구 클래스를 정의 할 수 있을까요?

당신은 linked_ptr<>의 템플릿 클래스 본문 내에서 다음과 같은 선언을 사용하여 서로의 linked_ptr<> 친구의 모든 다른 종류를 만들 수 있습니다

답변

1

"U가 T의 자식 인 경우에만 작동해야합니다. 만들 수있는 방법이 있습니까?"... 특성을 사용하십시오. U가 T에서 파생되었는지 확인하는 데 도움이됩니다.

라이브 예 ..

- http://ideone.com/dHZhHc < :

/** 
    Arguments can be (is_non_class_same<T, U>::value): 
     T = T  -> U = T for any class. 
     T = void* -> U = any non-class pointer. 
     T = int* -> U = int*. U cannot be a float*. Incompatible pointers. 
     T = int -> U = float 
     T = double -> U = float or int. Valid.. double is large enough to hold float and int. 
     T = int -> U = double Invalid.. double is larger than type float.. loss of precision. 
     T = float -> U = double Invalid.. double is larger than type float.. loss of precision. 

    Arguments can be (is_class_same<T, U>::value, U>::type): 

     T = Base* -> U = Base*. 
     T = Base* -> U = Derived* 
     T = Base -> U = Derived Invalid.. See: Slicing Problem. 
**/ 

예 (작업 코드) : 아래의 특성으로

, 다음을 사용하는 함수에 허용 된 인수는

1

: 그러나

template <class> friend class linked_ptr; 

이렇게, 당신은 당신이하려고하는 문제에 직면 호환되지 않는 포인터에 지정하십시오. 즉, UT과 다른 유형 인 경우, linked_ptr<U> *linked_ptr<T> *과 다른 유형이며 더 명확하게 U *T *과 다를 수 있습니다.

data = p.data;   // error: assigning U* to T* 
    next = p.next;   // error: assigning linked_ptr<U>* to linked_ptr<T>* 
    ... 

는 C++ 구문은 클래스 내에서 꾸밈 linked_ptr을 사용할 수 있습니다,하지만 정말 (채워 템플릿 매개 변수) 전체 템플릿 유형의 별칭입니다.

+0

U가 T의 하위 항목 인 경우에만 작동해야합니다. 이 방법이 있습니까? –