【问题标题】:Boost compiler error?Boost编译器错误?
【发布时间】:2013-12-12 06:22:38
【问题描述】:

我正在尝试构建这个程序:

#include "stdafx.h"
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>

using namespace std;

int main()
{
    using boost::interprocess;

    // Create the file mapping
    file_mapping fm("input.dat", read_only);
    // Map the file in memory
    mapped_region region(fm, read_only);
    // Get the address where the file has been mapped
    float * addr = (float *)region.get_address();
    std::size_t elements = region.get_size() / sizeof(float);
}

但我有两个问题,主要是:

1>tasker.cpp(98): error C2873: 'boost::interprocess' : symbol cannot be used in a using-declaration
1>tasker.cpp(101): error C2065: 'file_mapping' : undeclared identifier
1>tasker.cpp(101): error C2146: syntax error : missing ';' before identifier 'fm'
1>tasker.cpp(101): error C2065: 'read_only' : undeclared identifier
1>tasker.cpp(101): error C3861: 'fm': identifier not found
1>tasker.cpp(103): error C2065: 'mapped_region' : undeclared identifier
1>tasker.cpp(103): error C2146: syntax error : missing ';' before identifier 'region'
1>tasker.cpp(103): error C2065: 'fm' : undeclared identifier
1>tasker.cpp(103): error C2065: 'read_only' : undeclared identifier
1>tasker.cpp(103): error C3861: 'region': identifier not found
1>tasker.cpp(105): error C2065: 'region' : undeclared identifier
1>tasker.cpp(105): error C2228: left of '.get_address' must have class/struct/union
1>          type is 'unknown-type'
1>tasker.cpp(106): error C2065: 'region' : undeclared identifier
1>tasker.cpp(106): error C2228: left of '.get_size' must have class/struct/union
1>          type is 'unknown-type'

对于#include &lt;boost/interprocess/mapped_region.hpp&gt;,我得到了

1>C:\Users\Mike\Documents\boost_1_55_0\boost/intrusive/detail/has_member_function_callable_with.hpp(200): error C2228: left of '.select_on_container_copy_construction' must have class/struct/union
1>          type is 'boost::move_detail::add_rvalue_reference<U>::type'
1>          C:\Users\Mike\Documents\boost_1_55_0\boost/intrusive/detail/has_member_function_callable_with.hpp(276) : see reference to class template instantiation 'boost::container::container_detail::has_member_function_callable_with_select_on_container_copy_construction_impl<Fun,true,>' being compiled
1>          with
1>          [
1>              Fun=std::allocator<std::pair<const boost::interprocess::ipcdetail::sync_id *const ,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>>>
1>          ]
1>          C:\Users\Mike\Documents\boost_1_55_0\boost/container/allocator_traits.hpp(262) : see reference to class template instantiation 'boost::container::container_detail::has_member_function_callable_with_select_on_container_copy_construction<const Alloc,>' being compiled
1>          with
1>          [
1>              Alloc=std::allocator<std::pair<const boost::interprocess::ipcdetail::sync_id *const ,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>>>
1>          ]
1>          C:\Users\Mike\Documents\boost_1_55_0\boost/container/detail/tree.hpp(217) : see reference to class template instantiation 'boost::container::allocator_traits<A>' being compiled
1>          with
1>          [
1>              A=std::allocator<std::pair<const boost::interprocess::ipcdetail::sync_id *const ,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>>>
1>          ]
1>          C:\Users\Mike\Documents\boost_1_55_0\boost/container/detail/tree.hpp(246) : see reference to class template instantiation 'boost::container::container_detail::intrusive_rbtree_type<A,boost::container::container_detail::tree_value_compare<Key,std::pair<const Key,T>,Compare,boost::container::container_detail::select1st<std::pair<const Key,T>>>>' being compiled
1>          with
1>          [
1>              A=std::allocator<std::pair<const boost::interprocess::ipcdetail::sync_id *const ,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>>>
1>  ,            Key=const boost::interprocess::ipcdetail::sync_id *
1>  ,            T=boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>
1>  ,            Compare=boost::interprocess::ipcdetail::sync_handles::address_less
1>          ]
1>          C:\Users\Mike\Documents\boost_1_55_0\boost/container/map.hpp(83) : see reference to class template instantiation 'boost::container::container_detail::rbtree<Key,std::pair<const Key,T>,boost::container::container_detail::select1st<std::pair<const Key,T>>,Compare,Allocator>' being compiled
1>          with
1>          [
1>              Key=const boost::interprocess::ipcdetail::sync_id *
1>  ,            T=boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>
1>  ,            Compare=boost::interprocess::ipcdetail::sync_handles::address_less
1>  ,            Allocator=std::allocator<std::pair<const boost::interprocess::ipcdetail::sync_id *const ,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const boost::interprocess::ipcdetail::sync_id,void *>>>>>
1>          ]
1>          C:\Users\Mike\Documents\boost_1_55_0\boost/interprocess/sync/windows/sync_utils.hpp(226) : see reference to class template instantiation 'boost::container::map<const boost::interprocess::ipcdetail::sync_id *,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<T>>,boost::interprocess::ipcdetail::sync_handles::address_less,std::allocator<std::pair<const Key,boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<T>>>>>' being compiled
1>          with
1>          [
1>              T=std::pair<const boost::interprocess::ipcdetail::sync_id,void *>
1>  ,            Key=const boost::interprocess::ipcdetail::sync_id *
1>          ]

我正在使用适用于 Windows 桌面的 Visual Studio Express 2013,并使用 boost 1.55.0。

我尝试了其他 boost 库并且没有任何问题....另外,我使用的是 x64 发布版本。

【问题讨论】:

  • 您能否在问题中包含编译器错误?是根本找不到header,还是header报错?
  • 好的,我希望这可以帮助...

标签: c++ boost


【解决方案1】:

Boost 1.55 还不完全支持 Visual Studio 2013 编译器。

要么:

  • 使用 Visual Studio 2012 工具链
  • 或尝试从svn co http://svn.boost.org/svn/boost/trunk boost-trunk获取最新源
  • 或自己打补丁(别忘了upload your patch
  • 或等到有人修补它。你可以通过submitting bug report加速它

编辑

刚刚检查了boost-trunkboost/intrusive/detail/has_member_function_callable_with.hpp 已经打了补丁,它可以与vs2013vs2013-nov-2013-ctp 工具链一起正常编译。所以,试试吧。而且,如果您有多个 boost 版本,不要忘记像我一样更改包含路径(在 Makefile 或 VC 项目属性中)。 ;)

请注意,很明显,最新的开发代码可能不稳定。请勿将其用于最终用户生产。

【讨论】:

  • 谢谢,你知道有人修补了 boost 以支持 Visual Studio 2013 吗?
  • 嗯,不。 Boost 开发是一台巨大的机器。检查this 找出答案。
  • 好的,我已经添加了错误报告表单的链接。提交! ;)
  • 我刚刚用最新的boost-trunk 进行了检查。不编译。
  • @SkyRipper 我又检查了一次,实际上,boost-trunk 编译得很好。我刚刚忘记更改包括从boost-releaseboost-trunk 的搜索路径。请注意,我无法链接和运行它,因为我还没有编译 boost-trunk 库。所以,由你来检查;)将添加这个来回答。
【解决方案2】:

尝试改变这个:

using boost::interprocess;

到这里:

using namespace boost::interprocess;

(参考:http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/quick_guide.html 中的示例)

【讨论】:

  • 谢谢,这解决了第一个问题,但我仍然收到关于#include &lt;boost/interprocess/mapped_region.hpp&gt;的错误
【解决方案3】:

是的。你需要说“使用命名空间 boost::interprocess;” 解决这个问题,你应该会很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2016-11-20
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多