2015-01-06 2 views
0

저는 C++ Primer를 읽고 있습니다 :암시 적 인스턴스화는 언제 문제를 일으키는가?

"멤버 함수가 사용되지 않으면 인스턴스화되지 않습니다. 멤버를 사용하는 경우에만 멤버가 인스턴스화된다는 사실은 우리가 템플릿의 일부 작업에 대한 요구 사항을 충족하지 못할 수도 있습니다. "

왜 이것이 문제인지 알 수 없습니다. 일부 작업이 필요한 경우 컴파일러에서 이러한 작업을 인스턴스화하지 않는 이유는 무엇입니까? 누군가가 모범을 보일 수 있습니까?

+0

참조 HTTPS : //stackoverflow.com/questions/12797051/implicit-instantiation-of-undefined-template-when-forward-declaring-template-c – sashoalm

+3

누가 문제가 있다고 말했습니까? – Potatoswatter

+0

@sashoalm 그건 관련이 없습니다. – Potatoswatter

답변

2

이것은 사용하기 쉬운 기능이지 함정이 아닙니다.

지연 인스턴스화는 템플릿을 단순화하는 역할을합니다. 일부 특수화에 대해 일부 기능이 작동하지 않는 경우에도 특수화가 가질 수있는 모든 가능한 멤버 함수 세트를 구현할 수 있습니다.

컴파일러는 사용하지 않는 것을 인스턴스화 할 필요가 없기 때문에 컴파일 시간도 단축합니다.

가, 게으른 인스턴스를 방지 명시 적 인스턴스화 사용하려면 :

template class my_template<some_arg>; 

이 즉시 클래스의 모든 멤버를 인스턴스화합니다 (서식있는 회원을 제외한를, 상속, 또는 아직 정의되지 않음). 느린 템플릿을 컴파일하려면, 당신은 하나 개의 소스 파일 (번역 단위)에 위의 작업을 수행 한 후 헤더에 선언을 넣어, 다른 소스 파일에서 인스턴스를 우회 링커를 사용할 수 있습니다

extern template class my_template<some_arg>; 
+0

우수 답변. 가짜 퀴즈 중 상당수는 이것에 대한 경계를 포함하고 자주 잘못 받아들입니다. Kudos – sehe

+0

물론 유지 보수 구덩이 - 가을. 구현 자에게 합법적 인 것처럼 보이는 템플릿을 변경하면 (템플릿을 사용하기 위해 선결 요건이 선언 되었기 때문에) 특정 방법을 '짜기'하는 코드가 손상 될 수 있습니다. 템플릿은 매우 가치있는 유연성을 제공하지만 무료 점심이라고 생각하는 실수는하지 마십시오. 해결책은 구현자가 지연 인스턴스화 (all or nothing)를 방지하고 기본적으로 비활성화되도록하는 것입니다. – Persixty

+0

(추신 : 아마도 'POI'및/또는 _shallow instantiation_에 대한 언급이 좋을 것입니다.) 그리고 클래스 인터페이스에서 정적 개념 검사를 사용하여 초기 개념 검사를 수행하는 것일 수도 있습니다. – sehe