1

バージョン 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 ドキュメントの表と裏を作成しようとしましたが、その 2 番目のパラメーターが何に適しているのか、何に置き換えればよいのかわかりません。誰でもこれに光を当てることができますか?

更新:要件についてはよくわかりませんでした。少なくとも移行期間中は、両方のバージョン (1.34.1 と 1.46.1) をサポートする必要があります。Boost の両方のバージョンを同じコードでカバーする互換性のある方法はありますか、それとも#if BOOST_VERSION魔法に頼る必要がありますか?

更新 2:#if BOOST_VERSION ...これ以上の意見は出されていないため使用されます。助けてくれてありがとう。

4

2 に答える 2

4

boost::filesystem は、ファイル名の 2 つの形式を定義します。システムごとに異なるネイティブ形式と、システム間で同一のジェネリック形式です。POSIX(あなたが使用しているように見える)の下では、2つは同一です。Windows では、ネイティブ形式ではバックスラッシュが許可されますが、ジェネリック形式では許可されません。VMS では (たとえば)、この 2 つは大きく異なります (ネイティブ形式は のようなものです[dir.subdir]file)。

boost::filesystem::nativeあなたが提供しているファイル名がネイティブ形式であることを示すことを意図していたようです。boost::filesystem の現在のバージョンは自動的に決定されると思われますが、POSIX システムを使用しているため、とにかく違いはありません。

要するに、正しいことは単にパラメーターを省略することです。

于 2011-04-06T10:47:18.670 に答える
2

native現在は関数のようであり、pathコンストラクターはネイティブ指定子を必要としないようです。したがって、削除するだけで問題ありません。

于 2011-04-06T10:52:08.893 に答える