C ++의 다른 템플릿 함수에서 템플릿 클래스에 속하는 중첩 유형을 어떻게 사용할 수 있습니까?

스테판 그로스

튜플 유형을 기반으로 튜플을 초기화하는 함수와 컴파일 시간 인덱스를 유지하기 위해 Forsize_t 템플릿 인수가 있는 functor 구조체 를 설정하고 INDEX있습니다. 이 펑 터는 다른 템플릿 인자에 의존 할 수도 있습니다 T.... 이 때문에 functor TClass는 이러한 템플릿 인수를 보유하는 다른 구조 ( 이 예에서는) 내에 존재합니다 .

Bar여기에서 호출되는 초기화 함수 template<std::size_t> class에는 사용 된 클래스가 실제로 인덱스를 저장할 수 있는지 확인 하는 템플릿 인수가 있습니다.

내가 생각 해낸 디자인은 템플릿이 아닌 함수에서 호출 할 때 잘 작동 T2하지만 함수의 템플릿이 wrapper의 템플릿 매개 변수를 결정하면 컴파일되지 않습니다 TClass.

For내부에 감싸 인 펑터의 정의는 다음과 같습니다 TClass.

#include <cstdlib>

template <typename T> struct TClass {

    template<std::size_t INDEX> struct For {

        void operator()() {}
    };      
};

그리고 사용하려는 함수 호출은 다음과 같습니다.

template <template<std::size_t> class FOR> void bar() {
    //...
} 

template <typename T> void foo() {  
   bar<TClass<T>::For>(); //Does not compile
}

int main() {

    bar<TClass<int>::For>(); //Works
    foo<int>(); 

    return 0;
}

잘못된 foo호출에 대한 컴파일러 출력 은 다음과 같습니다.

error: dependent-name ‘TClass<T>::For’ is parsed as a non-type, but instantiation yields a type
    Bar<TClass<T>::For>(); //Does not compile

종속 유형 이름 앞에는 일반적으로 a가 와야한다는 것을 알고 typename있지만 이것은 첫 번째 bar호출 에도 필요하지 않습니다 . 템플릿 인수는 유형으로 만 해석 될 수 있기 때문이라고 생각했습니다. 즉, 어쩌면 생각 나는 그래서 typename올바른 컴파일 초래하지만 변경하는 경우 foo

template <typename T> void foo() {  
   bar<typename TClass<T>::For>(); //Does not compile
}

나는 얻다:

error: ‘typename TClass<int>::For’ names ‘template<long unsigned int INDEX> struct TClass<int>::For’, which is not a type
    Bar<typename TClass<T>::For>(); //Does not compile

더 이상 중첩 유형을 사용할 필요가 없기 때문에- ()연산자가 TClass템플릿 의존 하는 디자인도 생각해 냈습니다 INDEX. 다음과 같이 보입니다.

#include <cstdlib>

template <typename T> struct TClass {

    template<std::size_t INDEX> void operator()() {}
};

template <typename FOR> void bar() {
    //...
} 

template <typename T> void foo() {  
   bar<TClass<T>>(); //Does compile
}

분명히 유형의 템플릿이 함수의 템플릿 매개 변수에 의해 결정되는 함수에서 종속 유형 이름을 사용할 수 없지만 그 이유는 무엇입니까? 그리고 이것을 올바르게 구현하는 방법은 무엇입니까? 유형 특성으로 향후 유형 검사를 더 쉽게 작성하려면 펑터를 사용할 수 있으면 선호합니다.

맥심 에고 러쉬 킨

컴파일러는 TClass<T>::For템플릿 인스턴스화의 첫 번째 단계에서 템플릿 참조 하는 것을 알 수 없습니다 . template키워드에 대한 약간의 도움이 필요합니다 . 고치다:

template <typename T> void foo() {  
    bar<TClass<T>::template For>(); 
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관