0
어쨌든 나는 이것을 이해할 수 없다. answer. 우리는 간단한 중첩 된 이름 지정이 할 수없는 이유 멤버 함수가 외부 클래스를 정의 짧은 핸드 표기법이 수업 외부에서 작동하지 않는 이유는 무엇입니까?
(하는 대신 예를Foo::Foo(){}
를 들어
더 자세한
Foo<T>::Foo(){}
) 템플릿 선언이 멤버 직전 반복 후에도, 함수 정의.
어쨌든 나는 이것을 이해할 수 없다. answer. 우리는 간단한 중첩 된 이름 지정이 할 수없는 이유 멤버 함수가 외부 클래스를 정의 짧은 핸드 표기법이 수업 외부에서 작동하지 않는 이유는 무엇입니까?
(하는 대신 예를Foo::Foo(){}
를 들어
더 자세한
Foo<T>::Foo(){}
) 템플릿 선언이 멤버 직전 반복 후에도, 함수 정의.
신비감은
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();
}
필요한 이유
는 그래서입니다.
* 템플릿 클래스 *는 잘못된 이름입니다. 그것은 클래스 템플릿입니다. 즉, 클래스를 만드는 템플릿입니다. 클래스 자체는 아닙니다. – NathanOliver