2010-11-23 4 views
3

마이크로 소프트는 extension을 가지고 있습니다. 따라서 템플릿 인스턴스화가 외부로 선언 될 수 있습니다. 따라서 암시 적으로 인스턴스화되지 않습니다. 적어도 그것이 이론입니다. 내가와 push_back을 사용하더라도 프로그램이 찾을 링크 계속 (및 DUMPBIN이와 push_back 보여줍니다 : 나는 코드VS2008 extern templates

#include <vector> 

class Foo{ 
    int i; 
public: 
    virtual ~Foo(); 
}; 

extern template class std::vector<Foo>; 

이 나에게주는

warning C4231: nonstandard extension used : 'extern' before template 
explicit instantiation 

그러나, 아무것도 일이 일어날 것 같다 것을 재현 시도 인스턴스화되었습니다).

만 나는 예상대로

extern template void std::vector<Foo>::push_back(const Foo&); 

은 내가 링커 오류가 선언 할 때.

그래서 전체 인스턴스 (모든 멤버)를 명시 적으로 선언하여 암시 적 인스턴스화를 방지 할 수 있습니까?

답변

6

나는 당신이 확장에 대한 문서에서이 메모에 물린 것 같아요 :

전문화의 통근 키워드는 클래스의 신체의 외부에서 정의 된 멤버 함수에 적용됩니다. 클래스 선언 내에 정의 된 함수는 인라인 함수로 간주되며 항상 인스턴스화됩니다.

vector::push_back() (그리고 대부분 또는 표준 : : 벡터 <> 템플릿의 모두) 클래스 선언 내에서 정의된다.

메모에서 말하는대로 멤버 함수의 extern은 여전히 ​​인스턴스화가 발생하지만이 확장명이 문서화되지 않았거나 제대로 지정되지 않은 것 같습니다.

각 구성원 기능에 대해 명시적인 extern을 수행하지 않으면 원하는 작업을 수행 할 수 없다고 생각됩니다.

+0

나는 본다. 나는이 글을 읽을 때마다이 쪽지를 무시했다. –