카테고리 없음

[C ++] 템플릿 클래스의 멤버 함수 전문화

필살기쓰세요 2021. 2. 19. 23:12

프로그램에 정의되지 않은 동작이 있습니다.

Foo<int>::print()클래스 템플릿 정의에서 가져온 인라인 정의와 foo.cxx의 비 인라인 정의 의 두 가지 구현이 있습니다 . 컴파일러는 둘 중 하나를 자유롭게 선택할 수 있습니다.

이를 문제로 진단하는 데 컴파일러가 필요하지 않습니다. 그들 중 다수 (분명히 g ++ 및 MSVC 포함)는 클래스 템플릿 및 해당 멤버 함수의 정의를 위해 해당 경로를 선택합니다.

두 컴파일러가 foo.cxx에서 구현을 선택하도록하려면 foo.h에서 함수를 선언하십시오.

#include <iostream>

template<class _Tp>
struct Foo
{
   void print() { std::cout << "foo\n"; }
   };
   
   template<> void Foo<int>::print();
   
-------------------

흥미입니다. 템플릿은 링크 타임이 아니라 컴파일 타임에 해석된다는 것을 알고 있습니다. 따라서 제 생각에는 전문화 템플릿이 각 cpp 파일에서 구현되어야합니다. g ++ 버전은 무엇입니까?

-------------------

는 IF foo.h의 다음과 같은 외모, 모두 컴파일러는 동일한 결과를 생성합니다. 하지만 이유를 모르겠습니다.

#include <iostream>


template<class _Tp>
struct Foo
{
   void print();
   };
   
   template<class _Tp>
   void Foo<_Tp>::print()
   {
      std::cout << "foo\n";
      }
      
      template<> void Foo<int>::print();
      


출처
https://stackoverflow.com/questions/39940150