黒鳥3D研究所

3DCGでケモノを作る上で使えそうな技術をまとめていくブログ。主にソフトやプラグインの使い方をまとめます。その他雑記なども

【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);

他の方法としてはヘッダー側に実装を書いてしまう方法。

参考サイト

marycore.jp