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

时间:2011-12-18 16:01:16

标签: c++ boost boost-filesystem

我正在尝试使用Boost.Filesystem库迭代目录。

问题在于,当我尝试实例化一个路径对象时,我得到一个带有“字符串太长”消息的std :: length_error,其中包含任意长度的字符串,即使例如“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.

提前谢谢你, 卢卡

修改

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

抛出的函数是“转换”。从调试器中我看到了两者

&*c.begin()  

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

正确执行

2 个答案:

答案 0 :(得分:1)

您提到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-&gt;运行cmd.exe)并执行:

cd\
cd "boost root directory"
boostrap
.\b2

然后在Core 2 Duo 2.5GHz上等待大约45分钟。它将使用正确的CRT生成Boost库。如果你还有问题,那么你的构建系统就会出现更深层次的错误,例如在使用DLL CRT时链接到静态Boost库(你应该将DLL Boost与DLL CRT联系起来)。

答案 1 :(得分:1)

可以在项目中链接的库中找到可能的错误 (释放而不是调试)。 例如。

假设您正在使用Visual Studio 2010&#34; Debug&#34;配置有效。 你必须链接boost_filesystem-vc100-mt-gd-1_49.dll

boost_filesystem :库的基本名称

vc100 :Visual Studio版本(VS2010的vc100)

mt :多线程

gd :调试版

1_49 :版本

也许你没有&#34; gd&#34;就链接了图书馆。