boost filesystem :: path构造函数std :: length_error

Luc*_*lli 5 c++ boost boost-filesystem

我试图使用Boost.Filesystem库迭代目录.

问题是,当我尝试实例化一个路径对象时,我得到一个std :: length_error,消息"string too long",包含任意长度的字符串,即使例如"pippo".

我已经尝试了所有这些:

string s = "pippo";

path p(s);
path p(s.begin(), s.end());
path p(s.c_str());
path p("pippo");
Run Code Online (Sandbox Code Playgroud)

我在Windows 7上使用boost预编译版本1.47 for vc ++ 10.

谢谢,卢卡

编辑

这是执行的增强代码(path.hpp第129行)

template <class Source>
path(Source const& source,
  typename boost::enable_if<path_traits::is_pathable<
    typename boost::decay<Source>::type> >::type* =0)
{
  path_traits::dispatch(source, m_pathname, codecvt());
}
Run Code Online (Sandbox Code Playgroud)

并从(path_traits.hpp第174行)抛出错误

template <class U> inline
void dispatch(const std::string& c, U& to, const codecvt_type& cvt)
{
  if (c.size())
  convert(&*c.begin(), &*c.begin() + c.size(), to, cvt);
}
Run Code Online (Sandbox Code Playgroud)

抛出的函数是"转换".从调试器我看到了两者

&*c.begin()  
Run Code Online (Sandbox Code Playgroud)

&*c.begin() + c.size()
Run Code Online (Sandbox Code Playgroud)

正确执行

std*_*ave 1

你提到Boost是为VC++10预编译的,但你没有说你正在使用哪个编译器。如果您使用的是 Visual C++ Express,则需要自行编译。

但是,由于我即将使用 boost::filesystem,我想我应该自己研究一下以学习一些东西。

首先,您几乎不应该尽可能将整个 Boost 命名空间放入您的普通命名空间中(特别是如果您使用 std 这样做!)。像这样发布代码会让你看起来“使用命名空间”太多了。如果您不想到处输入 boost::filesystem,请执行以下操作:

namespace fs = boost::filesystem;
fs::path p(whatever);
Run Code Online (Sandbox Code Playgroud)

或者

using boost::filesystem::path;
using std::string;
string foo("Hello!");
path p(foo);
Run Code Online (Sandbox Code Playgroud)

像您这样在本地命名空间中包含 Boost 命名空间似乎会带来灾难性的后果(或者工作正常,这是抽签的运气)。正如您所注意到的,杀死它的函数调用是convert()——是否有另一个convert()在某个地方取代了它?

接下来,您应该启用自动链接(对于该库)。Boost 官方文档说使用自动链接。Boost 人员非常聪明(也许太聪明了 - 使用时间库很痛苦......)它非常适合 Visual Studio 2010。

如果这不能解决问题,则您的预编译 Boost 使用的是不同的 CRT(因为转换函数似乎位于 Boost 库中)。发生这种情况的原因有很多,例如,VS2k10 服务包可能安装在您的源上/未安装在您的源上,等等。

最终的解决办法是自己编译Boost。在 Windows 上这非常非常简单:下载 Boost 源代码,然后解压到任意目录。然后打开命令提示符(开始->运行 cmd.exe)并执行以下操作:

cd\
cd "boost root directory"
boostrap
.\b2
Run Code Online (Sandbox Code Playgroud)

然后在 Core 2 Duo 2.5GHz 上等待大约 45 分钟。它将生成具有正确 CRT 的 Boost 库。如果您仍然遇到问题,那么您的构建系统存在更深层次的问题,例如在使用 DLL CRT 时链接静态 Boost 库(您应该将 DLL Boost 与 DLL CRT 链接)。