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)
正确执行
你提到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 链接)。
归档时间: |
|
查看次数: |
1620 次 |
最近记录: |