enum
をバンドルされた頂点プロパティ内に持つboost::graph
を使用しようとしています。問題は、boost :: dynamic_propertyにバンドルされたプロパティを使用しようとすると始まります。 boost :: lexical_castが型を認識するためにテンプレートの特殊化を正しく行うことができないようです。boost :: property_mapsの列挙型のためのboost :: lexical_cast
#include <string>
#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/property_map/dynamic_property_map.hpp>
enum MyEnum { A, B, C };
namespace boost{
template<>
std::string lexical_cast(const MyEnum & m)
{
return std::to_string(int(m));
}
} /* boost */
struct EnumWrapper
{
MyEnum e;
EnumWrapper() = default;
EnumWrapper(MyEnum e) : e{e}
{}
};
int main()
{
using namespace boost;
// This works
MyEnum e{MyEnum::B};
std::cout << lexical_cast<std::string>(e) << std::endl;
// This doesn't compile
adjacency_list<vecS, vecS, directedS, EnumWrapper> graph;
dynamic_properties dp;
dp.property("test", get(&EnumWrapper::e, graph));
return 0;
}
enum
を直接書き込むと、すべて正常に動作します。ダイナミックプロパティにそれを置くしようとすると、次のエラーが表示されます。
In file included from /usr/include/boost/iterator/iterator_categories.hpp:22:0,
from /usr/include/boost/iterator/iterator_facade.hpp:14,
from /usr/include/boost/range/iterator_range_core.hpp:27,
from /usr/include/boost/lexical_cast.hpp:30,
from main.cpp:3:
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp: In instantiation of ‘struct boost::detail::deduce_target_char_impl<boost::detail::deduce_character_type_later<MyEnum> >’:
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:270:89: required from ‘struct boost::detail::deduce_target_char<MyEnum>’
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:407:92: required from ‘struct boost::detail::lexical_cast_stream_traits<std::__cxx11::basic_string<char>, MyEnum>’
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:468:15: required from ‘struct boost::detail::lexical_converter_impl<MyEnum, std::__cxx11::basic_string<char> >’
/usr/include/boost/lexical_cast/try_lexical_convert.hpp:181:44: required from ‘bool boost::conversion::detail::try_lexical_convert(const Source&, Target&) [with Target = MyEnum; Source = std::__cxx11::basic_string<char>]’
/usr/include/boost/lexical_cast.hpp:41:60: required from ‘Target boost::lexical_cast(const Source&) [with Target = MyEnum; Source = std::__cxx11::basic_string<char>]’
/usr/include/boost/property_map/dynamic_property_map.hpp:44:38: required from ‘Value boost::detail::read_value(const string&) [with Value = MyEnum; std::__cxx11::string = std::__cxx11::basic_string<char>]’
/usr/include/boost/property_map/dynamic_property_map.hpp:158:64: required from ‘void boost::detail::dynamic_property_map_adaptor<PropertyMap>::do_put(const boost::any&, const boost::any&, mpl_::bool_<true>) [with PropertyMap = boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>, boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>*, MyEnum, MyEnum&, MyEnum EnumWrapper::*>]’
/usr/include/boost/property_map/dynamic_property_map.hpp:186:11: required from ‘void boost::detail::dynamic_property_map_adaptor<PropertyMap>::put(const boost::any&, const boost::any&) [with PropertyMap = boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>, boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>*, MyEnum, MyEnum&, MyEnum EnumWrapper::*>]’
main.cpp:40:1: required from here
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:243:13: error: static assertion failed: Target type is neither std::istream`able nor std::wistream`able
BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_right_shift<std::basic_istream<wchar_t>, T >::value),
ラインTarget type is neither std::istreamable nor std::wistreamable
はlexical_castは、正しく専門されていないことを、私に示唆しています。しかし、字句キャストを使用すると、うまく動作するように見えます。
'Target = MyEnum;ソース= std :: __ cxx11 :: basic_string '。 Boostが* string *を* MyEnumに変換しようとしています。あなたは逆の方向しか提示していない。 –
ecatmur