2017-11-05 1 views
4

getouter<T>::inner<U>의 개인 생성자에 액세스 할 수있는 둘러싸는 범위의 함수로 만들려면 어떻게해야합니까? 내가 inner함으로써 클래스에서 그것을 선언 시도템플릿 함수를 템플릿으로 된 중첩 클래스의 친구로 선언하는 방법은 무엇입니까?

template <typename T> 
struct outer { 
    template <typename U> 
    class inner { 
     inner() {} 
    public: 
     friend inner get(outer&) { 
      return {}; 
     } 
    }; 
}; 


int main() { 
    outer<int> foo; 
    outer<int>::inner<float> bar = get<float>(foo); 
} 

template <typename V, typename W> friend inner<V> get(outer<W>&);가 있지만 그 중 하나가 작동하지 않았다. 내가 inner함으로써 클래스에서 그것을 선언 시도

답변

4

당신은 get 함수 템플릿입니다 컴파일러에게, 친구 선언하기 전에 템플릿 함수를 선언 할 필요가 템플릿을 <typename V, typename W> friend inner<V> get(outer<W>&);

있습니다. 예 : 총입니다

// definition of outer 
template <typename T> 
struct outer { 

    // forward declaration of inner 
    template <typename U> 
    class inner; 
}; 

// declaration of get 
template <typename V, typename W> 
typename outer<W>::template inner<V> get(outer<W>&); 

// definition of inner 
template <typename T> 
template <typename U> 
class outer<T>::inner { 
    inner() {} 
    public: 
    // friend declaration for get<U, T> 
    friend inner<U> get<U>(outer<T>&); 
}; 

// definition of get 
template <typename V, typename W> 
typename outer<W>::template inner<V> get(outer<W>&) { 
    return {}; 
} 

LIVE

+0

하나님. – user975989

+0

사실, 친구 정의는 이전에 클래스 밖 선언이 없으면 일반적으로 ADL을 통해서만 액세스 할 수 있습니다. 여기에 같은 효과를 얻을 수있는 방법이 있습니까? – user975989

+0

@ user975989 당신은 클래스를 벗어나는 정의를 제공하고 싶지 않다는 뜻입니까? – songyuanyao

관련 문제