6

尽管以下代码在 Linux 上编译,但我无法在 Windows 上编译它:

boost::filesystem::path defaultSaveFilePath( base_directory );
defaultSaveFilePath = defaultSaveFilePath / "defaultfile.name";
const std::string s = defaultSaveFilePath.native();
return save(s);

其中 base_directory 是一个类的属性,它的类型是 std::string,函数 save 只接受一个 const std::string & 作为参数。编译器抱怨第三行代码:

错误:请求从 'const string_type {aka const std::basic_string}' 转换为非标量类型 'const string {aka const std::basic_string}'

对于这个软件,我使用了 Boost 1.54(对于一些公共库)和 Qt 4.8.4(对于使用这个公共库的 UI),并且我用 MingW GCC 4.6.2 编译了所有东西。

似乎我的 Windows Boost 版本出于某种原因返回 std::basic_string 。如果我的评估是正确的,我问你:如何让 Boost 返回 std::string 的实例?顺便说一句,这可能吗?

如果我对这个问题的评价不好,我请你提供一些关于如何解决它的见解。

干杯。

4

3 回答 3

6

在 Windows 上,boost::filesystem 按照wchar_t设计表示本机路径 - 请参阅文档。这很有意义,因为 Windows 上的路径可以包含非 ASCII Unicode 字符。你无法改变这种行为。

请注意,这std::string只是std::basic_string<char>,并且所有本机 Windows 文件函数都可以接受宽字符路径名(只需调用 FooW() 而不是 Foo())。

于 2013-08-21T20:25:34.697 回答
4

如何让 Boost 返回 std::string 的实例?顺便说一句,这可能吗?

怎么样string()wstring()功能?

const std::string s = defaultSaveFilePath.string();

还有

const std::wstring s = defaultSaveFilePath.wstring();
于 2013-08-23T02:55:49.523 回答
3

Boost Path 有一个简单的函数集,可以为您提供“本机”(即可移植)格式的 std::string。make_preferred与 结合使用string。这可以在 Boost 支持的不同操作系统之间移植,并且还允许您在std::string.

它看起来像这样:

std::string str = (boost::filesystem::path("C:/Tools") / "svn" / "svn.exe").make_preferred().string();

或者,修改原始问题的代码:

boost::filesystem::path defaultSaveFilePath( base_directory );
defaultSaveFilePath = defaultSaveFilePath / "defaultfile.name";
auto p = defaultSaveFilePath.make_preferred(); // convert the path to "preferred" ("native") format.
const std::string s = p.string(); // return the path as an "std::string"
return save(s);
于 2017-06-18T00:57:17.057 回答