我正在尝试使用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()
正确执行
答案 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;就链接了图书馆。