2013-04-10 2 views
2

개인용 typedef를 사용하는 이유는 무엇입니까? 중복으로 인해 발생할 수있는 오류를 줄이기 위해 typedef를 사용하면 얻을 수있는 이점을 알 수 있지만 이러한 이점은 공용 typedef에서도 얻을 수 있습니다. 같은 일 (이 경우는, 유형)가 언급되는 경우 typedef를 사용하는공용 인터페이스에 사용되는 개인용 typedef

template < typename T > 
class foo 
{ 
    typedef typename T::some_type reused_type; 
public: 
    reused_type go(); 
}; 
+0

개인적으로 생각할 수없는 ... 예? –

+0

글쎄, 내부적으로 만 의미가있는 경우 네임 스페이스를 비공개로 만들면 혼란을 피할 수 있습니다. 예를 들어 내부 배열의 iterator 유형에 대한 바로 가기 인 경우입니다. – Dave

+1

이 경우 공용 인터페이스에서 사용됩니다. 따라서 엄격하게 내부가 아닙니다. – Zac

답변

3

한 실제 이유는 상황을 방지하는 것이 공개가 사방 typename, 한 실제 이유를 작성하는 것입니다 필요가 없도록하는 것입니다 엄청나게 다른 이름으로.

+0

당신은 좋은 지적을합니다. public으로 설정하면 다른 코드가 자신을 그 typedef에 묶을 수 있습니다 (예 : use). – Zac

+0

@Sharkos, 개인적으로 사용할 수없는 경우 - 공용으로 사용할 수있는 경우. 네가하는 말을 잘 모르겠다. – Zac

+0

@Sharkos : 클래스 외부에서 유형을 쉽게 * 사용할 수 있다는 것이 문제입니다. C++ 03에서는 코드를 바꾸고 템플릿으로 템플릿을 사용해야했습니다. C++ 11에서는'auto' 만 사용할 수 있습니다. 그러나 깨고 들어오는 것은 초청되는 것과는 다르다. 말하자면. –

1

내가 고안 할 수있는 한 가지 이유는 게시 된 인터페이스의 일부인 경우에만 공개되어야한다는 것입니다. 템플릿은 전문화 될 수 있으며 해당 유형이 일부 전문 분야에만 관련이 있지만 다른 분야에는 관련이 없다면 공개가되어서는 안됩니다. 예를 들어 : 예에서

template <typename T> class Foo 
{ 
    typedef typename T::value_type some_type; 
    some_type x; 
public: 
    int act() { return x.get(); } 
}; 

template <typename U> class Foo<std::vector<U*>> 
{ 
    typedef typename U another_type; 
    std::queue<another_type> q; 
public: 
    int act() { return q.size()/3; } 
}; 

, 당신은 Foo<T>::act()은 항상 int를 반환 약속,하지만 아무것도.

관련 문제