카테고리 없음
[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