使用带有宽字符串的boost :: iostreams :: mapped_file_source

时间:2011-07-13 04:03:13

标签: c++ visual-studio-2010 boost boost-filesystem boost-iostreams

如果我使用窄字符串实例化一个mapped_file_source(boost 1.46.1),如下所示我没有问题:

boost::iostreams::mapped_file_source m_file_( "testfile.txt" );

但是,如果我尝试使用宽字符串:

boost::iostreams::mapped_file_source m_file_( L"testfile.txt" );

我在VC2010 SP1中遇到以下编译器错误:

P:\libs\boost_1_46_1\boost/iostreams/device/mapped_file.hpp(128): error C2248: 'boost::iostreams::detail::path::path' : cannot access private member declared in class 'boost::iostreams::detail::path'
          P:\libs\boost_1_46_1\boost/iostreams/detail/path.hpp(111) : see declaration of 'boost::iostreams::detail::path::path'>
          P:\libs\boost_1_46_1\boost/iostreams/detail/path.hpp(37) : see declaration of 'boost::iostreams::detail::path'

如果我尝试传递构造函数一个boost :: filesystem :: path,我会收到以下错误:

P:\libs\boost_1_46_1\boost/iostreams/device/mapped_file.hpp(128): error C2664: 'boost::iostreams::detail::path::path(const std::string &)' : cannot convert parameter 1 from 'const boost::filesystem3::path' to 'const std::string &'
         Reason: cannot convert from 'const boost::filesystem3::path' to 'const std::string'

我觉得我错过了一些显而易见的东西,但我只是试图弄清楚编译器试图告诉我的内容,但我只是迷路了。那张手掌到额头的时刻才刚刚发生..我做错了什么?

mapped_file.hpp中定义的构造函数如下所示:

// Constructor taking a parameters object
template<typename Path>
explicit mapped_file_source(const basic_mapped_file_params<Path>& p);

basic_mapped_file_params类构造函数如下所示:

// Construction from a Path
explicit basic_mapped_file_params(const Path& p) : path(p) { }

// Construction from a path of a different type
template<typename PathT>
explicit basic_mapped_file_params(const PathT& p) : path(p) { }

模板类定义为:

// This template allows Boost.Filesystem paths to be specified when creating or
// reopening a memory mapped file, without creating a dependence on
// Boost.Filesystem. Possible values of Path include std::string,
// boost::filesystem::path, boost::filesystem::wpath, 
// and boost::iostreams::detail::path (used to store either a std::string or a
// std::wstring).
template<typename Path>
struct basic_mapped_file_params 
    : detail::mapped_file_params_base 
{

标题中还有一些额外的帮助:

// For wide paths, instantiate basic_mapped_file_params 
// with boost::filesystem::wpath

如果我采用这种方法:

boost::iostreams::basic_mapped_file_params<boost::filesystem::wpath> _tmp(L"test.txt");
boost::iostreams::mapped_file_source m_file_( _tmp );

我得到上面提到的 C2664 错误..

我知道编译器告诉我问题是什么,但是查看标题源和评论会让我相信我想要完成的是支持,这只是我的方法是不正确的。我误解了头文件告诉我的内容吗?我知道在某处可能有关于模板实例化和显式/隐式转换的好教训。

有趣的是,将我的升级安装升级到1.47.0似乎清除了 C2664 错误,但我仍然收到有关访问私有成员的 C2248 错误。

3 个答案:

答案 0 :(得分:2)

升力1.48我可以做这样的事情。

#include <boost/filesystem.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
#include <iostream>

int main()
{ 
  boost::filesystem::path p(L"b.cpp");
  boost::iostreams::mapped_file file(p); // or mapped_file_source
  std::cout << file.data() << std::endl;
}

或者您可以使用mapped_file_params(使用创建新文件)

来执行此操作
boost::filesystem::path p(L"aa");
basic_mapped_file_params<boost::filesystem::path> param; // template param
param.path = p;
param.new_file_size = 1024;

答案 1 :(得分:1)

它告诉你boost::iostreams::mapped_file_source的构造函数没有wchar_t*,也不需要boost::filesystem::path。只需std::string,或类型可转换为std::string。或者,换句话说,您不能将UTF-16路径与此对象一起使用。

答案 2 :(得分:1)

看起来mapped_file的文档很旧,并不反映标题或标题注释中的内容。为了使用宽字符串实例化boost::iostreams:mapped_file_source对象,您需要明确地传递boost::iostreams::detail::path,如下所示:

boost::iostreams::mapped_file_source m_file_( boost::iostreams::detail::path(boost::filesystem::path(L"testfile.txt")) );

我能够通过思考错误消息并确定如何实例化模板类来最终看到boost :: iostreams :: detail :: path有一个带有&amp; std的私有构造函数来编译它:: wstring作为参数,代码无法编译。