CRTPと__declspec(dllexport)
久々にHamigakiライブラリをビルド&インストールしようと思ったら、DLLの作成でコンパイルエラーになってしまいました。普段はexampleとtestだけをスタティックリンクでビルドしているので気が付きませんでした。
問題になっているのは、vorbis_encoder.hppのvorbis_encoder_baseです。
class HAMIGAKI_AUDIO_DECL vorbis_encoder_base : public hamigaki::iostreams:: arbitrary_positional_facade<vorbis_encoder_base,float,255> , private boost::noncopyable {
ここで、HAMIGAKI_AUDIO_DECLはライブラリのビルド時は__declspec(dllexport)に、それ以外の時は__declspec(dllimport)に展開されるマクロで、arbitrary_positional_facadeがCRTPを使っています。
どうもVC++(7.1/8.0)は、arbitrary_positional_facadeの使用されていないメンバ関数までエクスポートするようで、不要な関数(read_blocksなど)まで実装しろと怒られます。他のコンパイラだと問題ないわけですが、意味的にはエクスポートするクラスのメンバ関数は全てエクスポートするべきで、VC++の動きの方が正しいように思います。
arbitrary_positional_facadeの実装もかなり怪しいことですし、arbitrary_positional_facadeのテンプレート引数にIostreamsカテゴリを追加して、必要な関数だけ実装される形に直そうと思います。
で、ここを修正するとまたコンパイラのバグと格闘することになるんですよねぇ、、、。