我在这里有一些遗留代码,在版本1.34.1中使用了boost :: filesystem。我把它分成了一个小测试程序:
#include <iostream>
#include <boost/filesystem/path.hpp>
int main()
{
// note the second parameter
boost::filesystem::path p( "/tmp/foo", boost::filesystem::native );
std::cout << p.string() << std::endl;
return 0;
}
当我尝试使用当前(1.46.1)版本的Boost编译此代码时,出现以下错误:
test.cpp: In function ‘int main()’:
test.cpp:7: error: invalid conversion from ‘bool (*)(const std::string&)’ to ‘void*’
test.cpp:7: error: initializing argument 2 of ‘boost::filesystem3::path::path(const Source&, typename boost::enable_if<boost::filesystem3::path_traits::is_pathable<typename boost::decay<T>::type>, void>::type*) [with Source = char [9]]’
我试图对Boost文档做出正面或反面,但我似乎无法弄清楚第二个参数有什么用,或者用什么来代替它。任何人都可以对此有所了解吗?
更新:我对要求并不是很清楚。至少在过渡期内,我将不得不支持两个版本(1.34.1和1.46.1)。是否有兼容的方法来覆盖具有相同代码的两个版本的Boost,或者我是否必须诉诸#if BOOST_VERSION
魔法?
更新2:已使用#if BOOST_VERSION ...
,因为没有进一步的意见。谢谢你的帮助。
答案 0 :(得分:4)
boost :: filesystem为文件名定义了两种格式:native,不同系统,以及不同系统的通用。在POSIX(看起来像你正在使用的)下,两者是相同的。在Windows下,本机格式允许使用反斜杠,而通用格式则不允许。在VMS(例如)下,两者非常不同(原生格式类似于[dir.subdir]file
)。
boost::filesystem::native
似乎是为了表明您提供的文件名是原生格式。我相信当前版本的boost :: filesystem应该自动决定,因为你在POSIX系统上它无论如何都没有区别。
简而言之,正确的做法就是省略参数。
答案 1 :(得分:2)
native
现在似乎是一个函数,path
构造函数似乎不需要本机说明符。所以删除它应该没问题。