boost::filesystem: Обновление с 1.34.1 до текущей

У меня есть устаревший код, который использует boost::filesystem в версии 1.34.1. Я выделил его в небольшую тестовую программу:

#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 ..., так как не поступило никаких дополнительных мнений. Спасибо за помощь.


person DevSolar    schedule 06.04.2011    source источник


Ответы (2)


boost::filesystem определяет два формата имен файлов: родной, который отличается от системы к системе, и общий, идентичный для разных систем. В POSIX (который, по-видимому, вы используете) они идентичны. В Windows собственный формат допускает обратную косую черту, а общий формат — нет. Под VMS (например) они очень разные (собственный формат что-то вроде [dir.subdir]file).

boost::filesystem::native, по-видимому, предназначался для указания того, что имя файла, которое вы предоставляете, имеет собственный формат. Я считаю, что текущая версия boost::filesystem должна решать автоматически, и, поскольку вы работаете в системе POSIX, в любом случае это не имеет значения.

Короче говоря, правильно было бы просто опустить параметр.

person ymett    schedule 06.04.2011
comment
Это было очень полезно, и я получил бы галочку за правильный ответ, если бы я не был слишком туманным в отношении требований. Смотрите обновленный вопрос. - person DevSolar; 06.04.2011

native теперь кажется функцией, а конструктор path, похоже, не нуждается в нативном спецификаторе. Так что просто удалить его должно быть хорошо.

person Pablo    schedule 06.04.2011
comment
См. обновленный вопрос; извините, что не было яснее с самого начала. - person DevSolar; 06.04.2011