C++ 템플릿의 파일 분할

8666 단어 C++거푸집tech
이것은 C++ 템플릿 클래스 파일의 분할에 대한 자용 노트입니다.

기본적


C++ 템플릿은 기본적으로 제목 파일에서 설명하고 정의해야 합니다.
헤더 파일과 원본 파일로 파일을 분할하려면 명확한 설명이 필요합니다.
test_template.h
template <class T>
class TestTemplate
{
    public:
        TestTemplate() = default;

        T Add(T a, T b);
}
test_template.cpp
#include "test_template.h"

template <class T>
T TestTemplate<T>::Add(T a, T b)
{
    return a + b;
}

// 明示的に宣言
template class TestTemplate<double>;
main.cpp
#include "test_template.h"

int main()
{
    TestTemplate<double> test_template;
    double result = test_template.Add(1, 2);

    return 0;
}
그러나 템플릿 클래스에 내부 클래스나typedef 선언이 있는 경우에도 이를 명시해야 한다.

내부 클래스나 typedef 선언이 템플릿 클래스에 있을 때


test_template2.h
template <class T>
class TestTemplate2
{
    public:
        struct InnerStruct
        {
            T member;
        }

        TestTemplate2() = default;

        void setMember(const InnerStruct& s);
        InnerStruct getMember() const;

    private:
        InnerStruct inner_;
}
test_template2.cpp
#include "test_template2.h"

template <class T>
void TestTemplate2<T>::setMember(const InnerStruct& s)
{
    inner_ = s;
}

// typename が必要
template <class T>
typename TestTemplate2<T>::InnerStruct TestTemplate2<T>::getMember() const
{
    return inner_;
}

// 明示的に宣言
template class TestTemplate2<double>;
템플릿은 템플릿 매개 변수가 결정되기 전에 실체화되지 않습니다.
따라서 컴파일러는 TestTemplate2<T>를 알 수 없는 종류로 간주한다.
만약 그렇다면TestTemlate2<T>::InnerStruct이 클래스에 속하는지 구성원 변수에 속하는지 모르겠다.
이때 특별히 지정하지 않으면 컴파일러가 구성원 변수로 처리되기 때문에 지정InnerStruct은 유형 이름typename을 명확하게 나타낸다.

사이트 축소판 그림


감사합니다.
https://teratail.com/questions/123776

좋은 웹페이지 즐겨찾기