이것은 컴파일됩니다 (GCC 9 및 Clang 9로 테스트 됨).
template<typename U>
struct inherit : U { };
int test(inherit<int> arg);
그러나 이것은 그렇지 않습니다.
int test(inherit<int> arg) { }
첫 번째는 왜 컴파일됩니까?
int test(inherit<int> arg);
단지 선언 일뿐입니다. 따라서 우리는 inherit<int>
아직 알 필요가 없습니다 . 그 때문에 컴파일러는 그것을 놓아 줄 것입니다.
로 int test(inherit<int> arg) { }
지금 정의를 가지고 지금 우리가 알아야 할 inherit<int>
그래서 arg
파괴 될 때 함수가 종료합니다. 이 시점에서 템플릿이 인스턴스화되고 유효하지 않기 때문에 오류가 발생합니다.
선언을 무시하는 또 다른 이유 inherit
는 나중에 int
전문화 될 수 있고 다음과 같은 것을 가질 수 있기 때문에 해당 전문화가 실제로 유효한 클래스가 될 수 있다는 것입니다.
template<>
struct inherit<int> { };
당신은 사이 추가한다면 int test(inherit<int> arg);
하고 int test(inherit<int> arg) { }
있기 때문에 다음 코드는 이제 컴파일 할 inherit<int>
지금 유효한 유형입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다