参照渡しと定数

extractと同じように複数フォーマット対応のアーカイバも作りました。
archive.cpp
実装では、id:mb2sync:20060622 の問題に遭遇しました。

struct entry
{
    boost::optional<boost::uint16_t> attributes;

    // ...
};

struct msdos_attributes
{
    static const boost::uint16_t directory  = 0x0010;

    // ...
};

entry e;
e.attributes = msdos_attributes::directory;

ここで、boost::optionalの代入演算子が、

optional& operator = ( T const& v ) ;

なので、msdos_attributes::directoryのアドレスを要求され、リンカエラーになりました。
msdos_attributes::directoryのアドレスを使わなければよいので、

boost::uint16_t attr = msdos_attributes::directory;
e.attributes = attr;

とか、

e.attributes = static_cast<boost::uint16_t>(msdos_attributes::directory);

で回避できました。