2011-12-05 4 views
0

컴파일되지 않는 템플릿 코드가있어서 그 이유를 모르겠습니다. 이 문제는 라인 밖의 메서드 정의로 내부 클래스를 사용하는 것과 관련이있는 것으로 보입니다.내부 클래스를 사용한 템플릿 컴파일 오류

template<typename T> 
class Outer { 
public: 
    struct Inner { 
     T a; 
     Inner(T _a) : a(_a) {} 
    }; 
    int foo(T a); 
}; 

template<typename T> 
Inner Outer<T>::foo(T a) {   //Line 43 
    Inner ret(a); 
    return ret; 
} 

int main(int argc, char *argv[]) { 
    Outer<int> out; 
    return 0; 
} 

그램 ++ 4.2.1 에러 실패 : 43 상기 마크 된 라인을 참조하면 error: expected constructor, destructor, or type conversion before ‘Outer’ 다음은 간단한 예이다. foo의 정의를 인라인으로 이동하면 코드가 제대로 작동합니다.

또한 433 번 라인에서 InnerOuter<T>::Inner으로 바꾸려고 시도했지만 그 차이는 없습니다.

의견이 있으십니까?

+3

함수는 '내부'가 아니라 'int'를 반환합니다. –

답변

3

두 가지 문제가 있습니다. 먼저 int을 반환한다고 선언했습니다. 그러나 두 번째로, 바깥 쪽 범위 밖의 내부 유형에 액세스하려면 typename Outer<T>::Inner이 필요합니다.

+0

감사! int는 오타 였지만 typename은 문제를 수정했습니다. 나는 그것을 잡았어야했다. – bsowell

0

Inner의 정의는 반환 값 선언을 포함하는 클래스 외부에서 사용할 수 없습니다. 그것은 다음과 같아야합니다 :

template<typename T> 
typename Outer<T>::Inner Outer<T>::foo(T a) { 
관련 문제