3

次のように、mapped_file_source(ブースト1.46.1)を狭い文字列でインスタンス化した場合、問題はありません。

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

ただし、幅の広い文字列を使用しようとすると、次のようになります。

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

VC2010SP1で次のコンパイラエラーが発生します。

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'

明らかな何かが欠けているように感じますが、コンパイラが私に何を伝えようとしているのかを理解しようと円を描いて走り回っていますが、迷子になっています。その手のひらから額への瞬間は起こっていないだけです..私が間違っているのは何ですか?

maped_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エラーが発生します。

4

3 に答える 3

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;
}

または、これを maps_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;
于 2012-02-24T15:43:40.487 に答える
1

maps_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 に &std::wstring を受け取るプライベートコンストラクターがあることがわかりました。コードがコンパイルに失敗していたパラメータ。

于 2011-07-14T03:16:44.043 に答える
1

それboost::iostreams::mapped_file_sourceは、コンストラクタが をとらずwchar_t*、 もとらないことを示していboost::filesystem::pathます。のみstd::string、または に変換可能な型を取りますstd::string。別の言い方をすれば、このオブジェクトで UTF-16 パスを使用することはできません。

于 2011-07-13T04:48:43.043 に答える