가 명시 적 14.6.1/1 언어 표준에 의해 특정된다
이것은 표준의 이후 버전 ("주입 된 클래스 이름 인"의 개념을 통해) 재 모호 하였다
Within the scope of class template, when the name of the template is neither qualified nor followed by <, it is equivalent to the name of the template followed by the template-parameters enclosed in <>.
, 요점은이 동작이 문서에서 명시 적으로 철자가되어 있다는 것입니다.
질문의 두 번째 부분에 대답하기 위해이 규칙은 클래스가 아닌 메서드 정의를 작성할 때 매개 변수 선언에도 적용되지만 반환 형식 선언에는 적용되지 않습니다. 예를 들어,이 코드는
template <typename T> struct S {
S foo(S);
};
template <typename T> S<T> S<T>::foo(S s) {
/* whatever */
}
OK입니다하지만 당신은 방법의 정의에 반환 유형에서 <T>
비트를 제거 할 수 없습니다. 당신은 클래스 (<T>
으로) 전체 이름을 사용한다, 그러나 당신은 이름 <T>
을 사용하지 않아야합니다 : 특히 constructior에 관해서는
을 (. 그리고 당신은 방법의 정규화 된 이름에서 <T>
을 제거 할 수 없습니다) 생성자 자체의 따라서 귀하의 경우 밖으로의 클래스 정의에 대한 짧은 형태는
template <typename T> Wrapper<T>::Wrapper<T>(const Wrapper& w)
^ERROR !!!
에 당신이 원하는 경우에도 생성자 이름으로 <T>
비트를 추가 할 수 있다는
template <typename T> Wrapper<T>::Wrapper(const Wrapper& w) : t_(w.t_)
{
}
참고가 될 것입니다 추신 이 마지막 주장은 더 많은 연구가 필요합니다. Comeau Online 컴파일러는 GCC가 오류라고 생각하는 반면 오류가 있다고 생각합니다. 나중에 다시 돌아가겠습니다.
P.P.S. ,
template <typename T>
Wrapper<T>::Wrapper<T>(const Wrapper<T>& w) : t(w.t) {}
을하지만 클래스 내부 : MSVC++ 2005에서 컴파일러는
출처
2009-11-09 22:40:37
AnT
내가 GCC 4.4.2와 함께이 시도, 그것은 main1.cpp "로 거부 : 4 : 오류 : 생성자를 템플릿으로 사용하지 못했습니다. " 유즈넷 질문에 대한 답변을 보내 왔는데,이 내용에 대한 생각을 가지고 곧 나타납니다. –