gpt4 book ai didi

c++ - 将 boost::iostreams::mapped_file_source 与宽字符串一起使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:55 26 4
gpt4 key购买 nike

如果我用一个窄字符串实例化一个 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 错误..

我知道编译器告诉我问题出在哪里,但查看 header 源代码和注释让我相信我试图完成的事情得到支持,只是我的方法不正确。我是否误解了头文件告诉我的内容?我知道这里某处可能有关于模板实例化和显式/隐式转换的很好的类(class)。

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

最佳答案

有了 boost 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;

关于c++ - 将 boost::iostreams::mapped_file_source 与宽字符串一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com