Boost filesystem::路径构造器std::length_error
boost filesystem::path constructor std::length_error
我正在尝试使用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"的库
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::string.length() not counting
- 为什么 std::regex_match 不支持 "zero-length assertions" ?
- C++ std::string length() 或 size() 不适用于方法参数
- std::string的size()和length()有什么不同吗
- C 字符串的长度:std::strlen() vs. std::<char>char_traits::length()
- 将std::string::length转换为int
- 0-length数组(或std::array)有什么用
- std::string::length() vs. std::string::size()