템플릿 클래스 내부의 템플릿 함수


119

이 코드가 있습니다.

template <class T>
class MyClass {
    public:
        template <class U>
        void foo() {
            U a;
            a.invoke();
        }
};

이 형식으로 원합니다.

template <class T>
class MyClass {
    public:
        template <class U>
        void foo();
};

template <class T> /* ????? */
void MyClass<T>::foo() {
    U a;
    a.invoke();
}

어떻게 할 수 있습니까? 올바른 구문은 무엇입니까?


decl 클래스 안에서 decl 함수를 사용하지 않는 이유는 무엇입니까 ( codepad.org/wxaZOMYW 참조 )? 당신은 어쨌든 헤더에서 함수 자명 한 일 입니을 이동할 수 없습니다, 그래서 ...
hiobs

@hiobs : FWIW, 선언을 CPP 파일로 이동할 수 있습니다. 즉, 나는 해커 리를하기 위해 이것을 한 번만 수행했습니다. 이 경우이를 수행하는 방법을 아는 것이 중요합니다.
Thomas Eding 2013-08-01

때로는 함수 본문에 필요한 종속성을 정의한 후 함수 정의를 클래스 외부로 이동해야합니다. 이것은 클래스 A가 클래스 B를 사용하고 B도 A를 사용할 때 발생합니다.이 경우 A와 B를 선언 한 다음 A와 B 메서드를 정의합니다.
Wheezil 19

답변:


180

이것을 쓰십시오 :

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }

void MyClass <T> :: foo <T> () ... 감사합니다. 전에 해봤지만 작동하지 않습니다. 아마도 깨끗한 프로젝트를해야했습니다.
Michael

@ user1074367 : 아니요, 제가 말한 것 같습니다.
Kerrek SB

3
실제로 내가 썼다 : template <class T> template <class U> void MyClass <T> :: foo () {U a; a.invoke (); } 그리고 작동합니다
Michael

11
@ user1074367 : Err ... 그래, 내가 대답에서 말한 것이 아닌가?
Kerrek SB

8
@mike : 회원 템플릿은 완벽하게 정상적이고 일반적인 것입니다.
Kerrek SB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.