문제

가정한 헤더 파일에 함수를 정의합니다 템플릿입니다.지금 가 두 개의 구현 파일 #include 이 헤더,그리고 그들 각각의 함수 호출 템플릿입니다.모두 구현하는 파일에 함수는 템플릿과 동일한 유형이 있습니다.

// header.hh
template <typename T>
void f(const T& o)
{
    // ...
}

// impl1.cc
#include "header.hh"

void fimpl1()
{
    f(42);
}

// impl2.cc
#include "header.hh"

void fimpl2()
{
    f(24);
}

중 하나를 기대할 수 있습 링커는 것에 대해 불평의 여러 정의 f().특히,는 경우 f() 되지 않을 것 템플릿은 다음을 실제로는 경우이다.

  • 어떻게 링커지 않고 불평에 대한 다수의 정의 f()?
  • 그것은에서 지정한 표준을 링커 처리해야 합니다 이 정상적으로 상황?다시 말해서,할 수 있습니트에서 프로그램을 위와 유사한 컴파일과 링크?
  • 는 경우 링커할 수 있는 충분히 영리를 구분하는 설정의 기능 템플릿을 인스턴스화할 수 없는 이유가 무엇입니까 그것은 동일한 기능을 주어 그들은 동일한 경우와 마찬가지로 인스턴스화 기능 템플릿?
도움이 되었습니까?

해결책

을 지원하기 위해서는 C++,링커는 스마트 인식하기에 충분한 그들은 모두 동일한 기능을 발생한 모든지만 하나입니다.

편집:설명:링커에 비교하지 않는 기능 내용을 확인하는 동일합니다.템플릿화 기능으로 표시되는 이러한 링커 인식들이 동일한 서명이 있습니다.

다른 팁

The Gnu C++컴파일러 설명 좋은 토론이.발췌:

C++템플릿은 먼저 언어 기능이 필요한 더 많은 정보 환경에서보다 하나는 일반적으로 을 발견 유닉스 시스템입니다.어떻게 든 컴파일러/링커는지 확인 는 각 템플릿 발생합니다 인스턴스 정확히 한 번에 실행하는 경우 그것은 필요한 모든지 않습니다.두 가지 기본 접근이 문제는 불로 Borland 모델 Cfront 모델입니다.

Borland 모델

Borland C++해결 템플릿 인스턴스화 문제를 추가하여 와 동일한 코드의 일반적인 블록 그들의 링커;컴파일러 방출 템플릿의 경우 각 번역 는 단위 사용하고,그들을 링커 을 축소합니다.장점 이 모델의 링커만 를 고려합체 파일 자체;이 없 외장 복잡성을 걱정 없습니다.이 불리는 컴파일 시간 가 증가하기 때문에 코드 템플릿 이 컴파일되고 있습니다.코드 서면에 대한 이 모델하는 경향이 포함한 모든 템플릿 정의 헤더에 파일 이후 그들은 해야 합니다 본 것 인스턴스화됩니다.

Cfront 모델

AT&T C++번역,Cfront, 해결 템플릿을 인스턴스화 문제를 만들어의 개념 템플릿 저장소,자동으로 유지되는 곳 템플릿 인스턴스가 저장됩니다.더 현대적인 버전은 저장소의 작품으로 다음과 같:로 개별적 개체 파일 내장되어 있는 컴파일러 장소에 어느 템플릿 정의 에서 발생하는 인스턴스화 장합니다.링크 시 링크 래퍼가에서에 있는 개체 저장소 및 컴파일하고 모든 필요한 인스턴스에는 이전에 없던 내보냅니다.이 모델의 장점 더 많은 최적의 편집 속도 를 사용할 수 있는 시스템 linker;을 구현하 Borland 모델링 컴파일러 공급업체에도 대체할 필요가 링커.단점 훨씬 복잡성이 증가하고,따라서 잠재적 오류일부 코드 이 될 수 있습으로 투명하지만, 실제로 그것은 매우 어려울 수 있습니다 를 구축하는 여러 프로그램 중 하나에 디렉토리와 하나의 프로그램에 여러 개 디렉토리입니다.코드 작성을 위해 이 모델는 경향이 있는 별도의 정의 인라인이 아닌 구성원 템플릿으로 별도의 파일로 되어야 하는 별도로 컴파일.

과 함께 사용할 때 GNU ld 버전 2.8 나 나중에 요정과 같은 시스템 GNU/리눅스 또는 Solaris2,또는 Microsoft Windows,G++지원 Borland 모델입니다.다른 시스템에서는,G++ 를 구현하도 자동적인 모델입니다.

이것은 더 많거나 적은 특별한 경우만을 위한 템플릿이 있습니다.

컴파일러를 생성합 템플릿을 현실로 구현하는 실제로 사용됩니다.이 있기 때문에 대해 제어하는 기능을 제공하지 않 코드에서 생성될 것이 다른 소스 파일을 생성하는 코드 템플릿을 한 번에 대한 각각의 파일을 확인하는 방법을 가져옵에서 생성됩니다.

이후 해결하기 어려운 이(표준은 extern 키워드에 대한 템플릿지만,g++구현하지 않는다)를 링커에 단순히 수락 여러 정의입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top