C++ 別ヘッダーファイルで宣言したテンプレート関数を呼ぶとリンカエラーになる

やあ

C++なにもわからない僕が、親クラスと子クラスのヘッダーファイルを分け、親クラスでテンプレート関数を実装して、子クラスで呼び出そうとしたらリンカエラーが出たので、解決策をメモ。

状況例

Parent.h

class Parent
{
public:
    template<typename T>
    T Sum(T a, T b);
};

Parent.cpp

#include "Parent.h"

template<typename T>
T Parent::Sum(T a, T b) {
    return a + b;
}

Child.h

#include "Parent.h"

class Child : public Parent
{
private:
    int a;
    int b;
public:
    void Calc();
};

Child.cpp

#include "Child.h"
#include <iostream>

void Child::Calc() {
    std::cout << Sum(a+b) << std::endl;
}

こんな感じに、親クラスと子クラスのヘッダーファイルが分かれていると起こる。

解決策1

テンプレート関数の実装をヘッダーファイル内で行う。
Parent.h

class Parent
{
public:
    template<typename T>
    T Sum(T a, T b) {
        return a + b;
    }
};

解決策2

あまりよくない気がします。
親クラスと子クラスを同じヘッダーファイル内で定義する。

class Parent
{
public:
    template<typename T>
    T Sum(T a, T b);
};

class Child : public Parent
{
private:
    int a;
    int b;
public:
    void Calc();
};

参考

stackoverflow.com

stackoverflow.com