2011-09-13 2 views
1

템플릿 매개 변수 목록의 템플릿 매개 변수에서 이전 템플릿 매개 변수로 제공되는 형식의 형식 정의에 액세스 할 수 있는지 궁금합니다.템플릿 매개 변수 목록에서 이전 템플릿 매개 변수의 typedef에 액세스 하시겠습니까?

#include <iostream> 

template<typename V> 
struct TypeHolder { 
    typedef V value_type; 
}; 

template<typename T, T::value_type v> 
struct ValueHolder { 
    const static typename T::value_type value = v; 
}; 

int main() { 
    typedef TypeHolder<int> IntTypeHolder; 
    typedef ValueHolder<IntTypeHolder,5> Five; 

    std::cout << Five::value << std::endl; 

    return 0; 
} 

위 예제를 컴파일하면 다음과 같은 오류가 발생했습니다 :

[email protected]:~$ g++ -o cpptest test.cpp
test.cpp:8:25: error: 'T::value_type' is not a type

이것은 잘못된 구문으로 인한 것입니까 아니면 C++에서 가능하지 않은 것입니까?

+2

첫 번째 문제는 구조체 정의 끝에 세미콜론이 누락되었습니다. 나는 그것을 수정하고 더 관련있는 오류로 업데이트했다. 내가 잘못했는지 알려주세요. –

답변

0

잘못된 구문으로 인해 T::value_type v으로 무엇을하려고하면 값을 올바르게 얻는 것입니까? 그런

그리고보다 효율적으로 사용 무언가 :

template<typename T> 
struct ValueHolder { 
    const static typename T::value_type value; 
    ValueHolder(typename T::value_type v) 
    { 
     ValueHolder::value = v; 
    } 
} 
+0

생성자 매개 변수에'typename'이 없습니까? – Nawaz

+0

잘 모르겠지만, 맞았습니다 – Geoffroy

+0

코드를 변경하지 않으셨습니까? 매개 변수 *에서도'typename'을 사용해야한다고 확신하지 못했습니까? – Nawaz

4

입니다. 키워드 typename이 누락되었습니다.

template<typename T, typename T::value_type v> 
struct ValueHolder { ^^^^^^^^ 
    ... 

T::value_type이 유형임을 컴파일러에 알려야합니다. Demo. 템플릿 매개 변수에 typename 접두사 경우

+2

Nevermind. 나는 매우 혼란스러워했다. C++ 문법은 너무 애매 모호합니다. –

1

는 컴파일 :

template<typename T, typename T::value_type v> 
struct ValueHolder { 
    const static typename T::value_type value = v; 
} 
typename의 사용은 컴파일러 도움

이 경우에 T:: 네임 스페이스 내에서 참조 식별자 value_type이 형이 아닌 멤버 함수 것을 알고 또는 변수.

1

는 다음을 시도해보십시오

template<typename T, typename T::value_type v> 
struct ValueHolder { 
    const static typename T::value_type value = v; 
}; 

잡았다위한 value_type는 C++ 파서 말할 수있는 것을 의미하지 않는다 Ttypedef 구성원 불행하게도해서 ... 당신의 T:value_type에 "유형 이름"을 접두사. 실제 정적 데이터 멤버, 정적 메서드 등일 수 있습니다. 따라서 다른 네임 스페이스/클래스의 정규화 된 형식에 액세스 할 때는 typename이라는 접두사를 붙여야합니다.

+0

나를위한 교육적인 순간을 제공하십시오 ... 왜 downvote? – Jason

+0

오, 그래, 고마워 .--) ... 나는 답을 편집하여 해당 코드 부분만으로 더 명확하게 할 것이다. – Jason

+0

설명과 +1을 보았습니다. :) –

관련 문제