ヘッダファイルを分ける理由

ヘッダファイルに定義も書くと、ライブラリを公開する時ユーザーにコンパイルさせることになってしまう。よってヘッダには宣言だけ書いて定義はソースでするべき。(宣言さえあれば名前解決できるから)

ただし関数テンプレートを使う場合は、実装もヘッダファイルに書かなければいけない。 なぜなら、テンプレートの定義が書かれているソースファイルをコンパイルする際、テンプレートパラメータが具体的にどんな型になるかが不明であるため、テンプレートの実体化が行われないから。