2008-10-13 4 views
2

다음과 같은 이유가 무엇인지에 대해 머리를 쓰려고합니다. 나는 표준 : : 벡터를 가지고 있고 그것의 정적 멤버 함수과 같이 VALUE_TYPE 포함되어있어 전화를 걸 :C++ STL 컨테이너의 value_type의 정적 멤버 함수 호출

벡터 사실에 템플릿 유형에 대한 형식 정의입니다
std::vector<Vector> v; 
unsigned u = v.value_type::Dim(); 

:

template <typename T, unsigned U> class SVector; 
typedef SVector<double, 2> Vector; //two-dimensional SVector containing doubles 

및 정적 멤버 함수 Dim()은 실제로 벡터의 차원을 나타냅니다. 나 퍼즐

error: ‘SVector<double, 2u>’ is not a base of 
‘std::vector<SVector<double, 2u>, std::allocator<SVector<double, 2u> > > 

:

지금 컴파일러라는 오류 메시지를 반환합니다. 나는

unsigned u = Vector::Dim(); 

에 의해 분명히 기분을 상하게 라인을 대체 할 수있는 그 작동하지만, 그것은 V의 VALUE_TYPE ... 감사에 대한 가정을 하드 코드로 분명 추한입니다!

답변

15

변수 유형이 아니라 변수 인스턴스를 통해 value_type에 액세스하고 있습니다.

방법 1 -이 작품 :

typedef std::vector<Vector> MyVector; 
MyVector v; 
unsigned u = MyVector::value_type::Dim(); 

방법 2 - 나이 :

std::vector<Vector> v; 
unsigned u = std::vector<Vector>::value_type::Dim(); 

당신은 당신이 벡터 템플릿 매개 변수에 대한 가정을 하드 코딩하지 않는 방법 1에 좋아하는 타입 정의 경우 당신은 깨끗한 코드를 작성한다.


편집 : 질문 소유자의 요청에 따라이 문제에 대한 동작을 설명하기 위해 확장 :

범위 결정 연산자 ::는 다른 C++ 연산자보다 precedence 높은있다. 여기에는 객체 . 연산자의 멤버 액세스가 포함됩니다. 당신은 같은 것을 쓸 때 따라서 :

unsigned u = v.SVector<double, 2>::Dim(); 

을 궁극적으로 무엇을 먼저 해결하면 SVector<double, 2>::Dim() 일부입니다

unsigned u= v.value_type::Dim(); 

를이 다음과 같은 C++ 코드를 해결합니다. 이것은 물마루 변수 v으로 선언 된 벡터 인스턴스가 SVector라는 이름의 템플릿 화 된 내부 클래스를 갖도록합니다. 그리고이 발생하지 않기 때문에이 오류가 발생합니다 :

error C2039: 'SVector<double,2>' : is not a member of 'std::vector<_Ty>' 

STL vector이 패턴 (접근 VALUE_TYPE 트로프 instance 변수가 아닌 변수 타입)의 각 사용을 위해 "확장"되어야 할 것이다. 이것은 많은 상용구와 불필요하고 유지 보수가 불가능한 코드으로 이어 지므로 좋은 해결책이 아닙니다. 위에서 언급 한 솔루션을 따르면이 모든 것을 피할 수 있으며 원하는 작업을 쉽게 수행 할 수 있습니다.

+0

많은 분들께 감사드립니다.인스턴스를 통해 value_type에 액세스 할 수 없다는 것을 알지 못했습니다. 혹시 이것이 허용되지 않는 이유를 알고 싶습니까 (허용되면 잘못 될 수 있습니다)? – yungchin

+0

@yungchin이 방금 추가 한 설명이이 문제에 대해 충분히 명확한 지 확인하십시오. –

+0

허용 된 경우 아무 것도 잘못 될 것입니다. C++은 정적으로 타입이 지정되어 있기 때문에 이미 v가 std :: vector 이라는 것을 알고 있지만 다시 v는 무엇인지 이미 알고 있으므로 실제로 아무런 차이가 없습니다. 나는 C++ 디자이너가 정적 멤버와 인스턴스 멤버를 명확히 구분하고 싶어한다고 생각합니다. –