Boost filesystem::路径构造器std::length_error

boost filesystem::path constructor std::length_error

本文关键字:length std error 构造器 filesystem 路径 Boost      更新时间:2023-10-16

我正在尝试使用Boost迭代目录。文件系统库。

问题是,当我尝试实例化一个路径对象时,我得到一个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");

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

提前谢谢你,卢卡

编辑

这是执行的boost代码(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());
}

,错误从(path_traits.hpp line 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);
}

抛出的函数是"convert"。从调试器中,我看到

&*c.begin()  

&*c.begin() + c.size()

您提到Boost是为vc++ 10预编译的,但您没有说您使用的是哪种编译器。如果你使用的是Visual c++ Express,你需要自己编译。

但是,既然我要使用boost::filesystem,我想我应该自己调查学习一点。

首先,只要可能,您几乎不应该将整个Boost命名空间放入您的普通命名空间中(特别是在使用std时)。像这样发布代码会让人觉得你过多地"使用名称空间"。如果您不想到处输入boost::filesystem,那么这样做:

namespace fs = boost::filesystem;
fs::path p(whatever);

using boost::filesystem::path;
using std::string;
string foo("Hello!");
path p(foo);

在本地名称空间中包含Boost名称空间可能会产生灾难性的后果(或者工作良好,这是运气)。正如您所注意到的,杀死它的函数调用是convert() -是否可能在某个地方有另一个convert()取代它?

接下来,您应该启用自动链接(针对此库)。官方Boost文档说要使用自动链接。Boost的人非常聪明(也许太聪明了——使用时间库是一种痛苦……)在Visual Studio 2010中运行良好。

如果这不能修复它,那么您的预编译Boost正在使用不同的CRT(因为转换函数似乎在Boost库中)。发生这种情况的原因有很多,例如,VS2k10服务包可能安装在您的源代码上/没有安装在您的源代码上,等等。

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

cd
cd "boost root directory"
boostrap
.b2

然后在酷睿2双核2.5GHz上等待大约45分钟。它将生成带有正确CRT的Boost库。如果你仍然有问题,那么你的构建系统有更深层次的问题,比如在使用DLL CRT时链接静态Boost库(你应该链接DLL Boost与DLL CRT)。

您在项目中链接的库可能存在错误(发布而不是调试)。例如,

假设你正在使用Visual Studio 2010与"调试"配置激活。你必须链接boost_filessystem -vc100-mt-gd-1_49.dll

boost_filesystem: basename of library

vc100: Visual Studio版本(vc100 for VS2010)

:多线程

gd:调试版本

1 _49 :

版本

也许你链接了没有"gd"的库