boost :: program_optionsを使用していて、「ドメイン」のようなオプションをプログラムに渡したい。そのようなドメインは単純です:
template<typename T>
struct CDomain
{
CDomain(T min = -1, T max = 1) {_min = min; _max = max;};
T _min;
T _max;
};
このオプションクラスのカスタムバリデーターを作成しましたが、これはうまく機能します。今、私はデフォルト値を追加したかったので、
desc.add_options()("domain", po::value<CDomain<long double> >()->default_value(CDomain<long double>(-1,1)), "domain");
boost :: program_optionsが演算子を要求しました<<:
error: no match for ‘operator<<’ in ‘stream << input’
これを追加しましたが、それでも同じエラーメッセージが表示されます。
template<typename T>
ostream& operator<<(ostream& o, CDomain<T>& d)
{
return o << "[" << boost::lexical_cast<string>(d._min) << ":" << boost::lexical_cast<string>(d._max) << "]";
}
カスタムオプションの説明で出力されるデフォルト値で使用するoperator<<を定義するにはどうすればよいですか?
もう少し調査しました。エラーは次の場所で発生しboost/lexical_cast.hpp:1147 In member function bool boost::detail::lexical_stream_limited_src<CharT, Traits, RequiresStringbuffer>::shl_input_streamable(InputStreamable&) [with InputStreamable = const CDomain<long double>, CharT = char, Traits = std::char_traits<char>, bool RequiresStringbuffer = true]
ます:
template<typename InputStreamable>
bool shl_input_streamable(InputStreamable& input)
{
std::basic_ostream<CharT> stream(&stringbuffer);
bool const result = !(stream << input).fail();
start = stringbuffer.pbase();
finish = stringbuffer.pptr();
return result && (start != finish);
}
これは名前空間の問題である可能性がありますが、ostream& operator<<(ostream& o, CDomain<T>& d)
boost::detailに移動しても問題は解決しませんでした。