【问题标题】:boost::filesystem: Updating from 1.34.1 to currentboost::filesystem:从 1.34.1 更新到当前
【发布时间】:2011-04-06 10:18:24
【问题描述】:

我这里有一些遗留代码在 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 ...,因为没有进一步的意见。感谢您的帮助。

【问题讨论】:

    标签: c++ boost-filesystem


    【解决方案1】:

    boost::filesystem 定义了两种文件名格式:native(因系统而异)和 generic(跨系统相同)。在 POSIX(这似乎是您正在使用的)下,两者是相同的。在 Windows 下,本机格式允许使用反斜杠,而通用格式则不允许。在 VMS(例如)下,两者非常不同(原生格式类似于 [dir.subdir]file)。

    boost::filesystem::native 似乎旨在表明您提供的文件名是本机格式。我相信当前版本的 boost::filesystem 应该是自动决定的,而且由于您使用的是 POSIX 系统,所以无论如何都没有区别。

    简而言之,正确的做法就是省略参数。

    【讨论】:

    • 这很有帮助,如果我对这些要求不是太模糊的话,会获得一个“正确答案”的复选标记。查看更新的问题。
    【解决方案2】:

    native 现在似乎是一个函数,path 构造函数似乎不需要本机说明符。所以删除它应该没问题。

    【讨论】:

    • 查看更新的问题;很抱歉从一开始就没有更清楚。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2016-06-02
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多