【XCode 9.2】C++でテンプレートクラス書いたら Undefined symbols for architecture arm64: した
XCodeでテンプレートクラスを作ったらハマったのでメモ
/*test.h*/ template <class T> class Test { public: T max(T a, T b); };
/*test.cpp*/ template <classT> T Test<T>::max(T a, T b) { if(a < b) return b; return a; }
このように実装ファイル側で実装部を書くと Undefined symbols for architecture が出てしまう。 実装が別ファイルだとmain関数などからファイルが見えないためにテンプレートの展開・実体化ができないのが問題らしい。 この場合の解決法としては、実装ファイル側でテンプレートを明示的にシンボル化すれば良い。
/*test.cpp*/ template Hoge Hoge Test<Hoge>::max(Hoge a, Hoge b);
他の方法としてはヘッダー側に実装を書いてしまう方法。