0

我目前正在开发一个利用 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

4

0 回答 0