2017-09-29 3 views
0

어쨌든 나는 이것을 이해할 수 없다. answer. 우리는 간단한 중첩 된 이름 지정이 할 수없는 이유 멤버 함수가 외부 클래스를 정의 짧은 핸드 표기법이 수업 외부에서 작동하지 않는 이유는 무엇입니까?

(하는 대신 예를 Foo::Foo(){}를 들어 더 자세한 Foo<T>::Foo(){}) 템플릿 선언이 멤버 직전 반복 후에도, 함수 정의.

+2

* 템플릿 클래스 *는 잘못된 이름입니다. 그것은 클래스 템플릿입니다. 즉, 클래스를 만드는 템플릿입니다. 클래스 자체는 아닙니다. – NathanOliver

답변

1

신비감은

template<class T> 
int VisitedSet::getSize() { 
    return vec.size(); 
} 

C++ 컴파일러에 T가 적용 아직 무엇인지 것입니다. VisitedSet의 클래스 정의에서 작업 할 때는 VisitedSet::...을 명확하게 사용할 수 있지만 외부에서는 작동하지 않습니다.

클래스 정의 밖에있는 경우 구문을 사용하면 tempate<class T> 구문을 사용하는 템플릿 매개 변수를 컴파일러에 알려야하며 컴파일러에게 적용되는 위치를 컴파일러에 알려야합니다.

template<class X, class Y> 
int Foo<Y>::Bar<X>::getSize() { ... 

template<class A, class B> 
int Foo<A>::Bar<B>::getSize() { ... 
: 그럼 당신은 구체적으로해야하는 이유가 더 분명

template<class T> 
class Foo { 
    template<class R> 
    class Bar { 
     int getSize(); 
    }; 
}; 

다음 중첩 된 경우 모호한 것 같다,하지만 고려할 수있다이 경우

,

모두 유효합니다. 당신도 당신이 연결이 질문에 표시된 간단한 경우

template<class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 

필요한 이유

는 그래서입니다.

관련 문제