我目前正在开发一个利用 Boost C++ 库的 Microsoft(非托管)C++ 项目。自从我完成 C++ 以来已经有一段时间了,而且我以前没有使用过 Boost 库的经验。
我们正在使用 Boost 1.55 和 MSVC 2013。我们使用 CMake 根据原始项目布局生成 Visual Studio 解决方案和项目。
我们已经在其他环境中成功构建和测试。在 MSVC - Windows 环境中,我们在使用 Boost 的属性树支持时遇到了问题。具体来说,问题似乎集中在尝试将属性放入 PTNode 中。
考虑以下代码片段:
void XXX:: SomeFunction()
{
PTnode ptNode;
ptNode(Mapper::KEY_INPUT, Tracer::SOME_VALUE);
ptNode(Mapper::KEY_OUTPUT)(Tracer::SOME_OTHER_VALUE, Tracer::ADDITIONAL_VALUE);
SetResults(ptNode);
}
void XXX::SetResults(const PTree& pTree)
{
std::string results = pTree.get_child(Mapper::KEY_OUTPUT).get<string>(Tracer::SOME_OTHER_VALUE);
}
在 ::SetResult() 中,我们立即尝试检索我们在树中插入的值。Boost 抛出异常,因为它找不到该节点(树实际上是空的)
这是调用堆栈的样子:
SomeDLL.dll!boost::property_tree::basic_ptree<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > >::get_child(const boost::property_tree::string_path<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,boost::property_tree::id_translator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > > & path) Line 557 C++ SomeDLL.dll!boost::property_tree::basic_ptree<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > >::get_child(const boost::property_tree::string_path<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,boost::property_tree::id_translator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > > & path) Line 567 C++ SomeDLL.dll!boost::property_tree::basic_ptree<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > >::get<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> >(const boost::property_tree::string_path<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>,boost::property_tree::id_translator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
> > > & path) Line 732 C++
实际抛出异常的Boost代码:template basic_ptree & basic_ptree::get_child(const path_type &path) { path_type p(path); self_type *n = walk_path(p); if (!n) { BOOST_PROPERTY_TREE_THROW(ptree_bad_path("没有这样的节点", path)); } 返回 *n; }
我们找到了解决此问题的方法。hack/fix 是构建路径并通过 put() 直接将其插入树中。
void XXX:: SomeFunction()
{
PTree pTree;
pTree.put(Mapper::KEY_INPUT, Tracer::SOME_VALUE);
pTree.put(Mapper::KEY_OUTPUT + "." + Tracer::SOME_OTHER_VALUE, Tracer::ADDITIONAL_VALUE);
SetResults(pTree);
}
void XXX::SetResults(const PTree& pTree)
{
std::string results = pTree.get_child(Mapper::KEY_OUTPUT).get<string>(Tracer::SOME_OTHER_VALUE);
}
这种解决方法似乎成功地将节点插入到树中。我们可以通过在 ::SetResult() 中找到插入的项目来进行验证。
关于为什么这可能在 VisualStudio C++ 中失败的任何想法?
这是编译器标志的问题吗?
预编译器定义?
链接器选项??
记忆模式/型号??
MSVC C++ 和其他 C++ 环境中是否存在一些我们不知道的基本行为差异?
我试图识别节点插入模式的所有实例并使用解决方法。但是,我们确实需要找出问题所在(因为可能还有其他表现形式)。
任何想法,指导,想法?其他地方可以搜索此问题的答案?
在此先感谢,约翰B