やあ
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(); };