iostream GCC错误,转换为boost::filesystem::iostream for Windows
iostream GCC errors, converting to boost::filesystem::iostream for Windows
我正在尝试将一个用C++14编写的应用程序转换为linux/MacOS。它使用boost::文件系统,但不用于某些iostream操作。例如:
boost::filesystem::path file = name;
std::ifstream fin(file.c_str());
此代码无法在Windows 10上使用带有GCC 6.3的MinGW进行编译,如下所示:
错误:没有用于调用的匹配函数'std::basic_ifstream::basic_ifstream(const value_type*)'std::ifstream-fin(file.c_str());
我想如果我能将std::ifstream转换为boost::filesystem::ifstream,我就能让它工作。。。所以我把代码改成了这个:
boost::filesystem::path file = name;
boost::filesystem::ifstream fin(file.c_str());
if (!fin)
{
file = pathToAppData / "files/expansion/assets/resources/basestation/config/mapFiles/racing" / name;
fin = boost::filesystem::ifstream(file.c_str());
if (!fin)
throw std::runtime_error(std::string("Cannot open Anki Overdrive map file ") + file.string() + ".");
}
fin >> (*this);
这导致了这个错误:
错误:'const-boost::filesystem::basic_ifstream&boost::filesystem::basic_ifstream::operator=(constboost::filesystem::basic_ifstream&)[其中charT=char;tracts=std::char_traits]'在此上下文中是私有的
fin=boost::filesystem::ifstream(file.c_str());
看起来我无法在创建后重新分配boost::filesystem::ifstream。。。我能够将该行更改为以下内容并进行编译,但我想知道这是否是正确的方法:
boost::filesystem::ifstream fin(file.c_str());
额外的问题:一旦我让它工作起来,这个代码应该在linux上也工作吗?
在Windows上,boost::filesystem::path::value_type
是wchar_t
,因为Windows路径使用16位UTF-16字符的字符串。根据C++标准,std::ifstream
类只有一个采用窄字符字符串的构造函数。Visual Studio标准库向ifstream
添加了额外的构造函数,这些构造函数采用宽字符串,但MinGW使用的GCC标准库没有这些额外的构造函数。这意味着file.c_str()
返回的const wchar_t*
对于std::ifstream
的构造函数参数是错误的类型。
您可以将path
转换为窄字符串(通过调用file.string()
),并将其传递给ifstream
构造函数,尽管我不知道它是否能正常工作:
boost::filesystem::path file = name;
std::ifstream fin(file.string());
正如您所说,boost::filesystem::ifstream
是不可分配的(在C++11流不可移动或分配之前,Boost.Filesystem流似乎还没有更新)。您可以简单地更改代码,使用相同的流对象重新打开一个新文件,而不是尝试重新分配给它:
fin.close();
fin.open(file);
(请注意,您不需要调用c_str()
,因为boost::filesystem::ifstream
构造函数无论如何都会获取path
参数,而不是指向字符串的指针。通过调用c_str()
,您只需将path
转换为字符串,然后将其转换回另一个path
,这会浪费时间和内存。)
额外的问题:一旦我让它工作起来,这个代码应该在linux上也工作吗?
是。在GNU/Linux上,filesystem::path::value_type
是char
,因此原始代码无论如何都可以正常工作。修改后的代码也将在GNU/Linux上运行。
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- std::filesystem::copy throws filesystem_error
- 需要从 istream 和 ostream 派生 iostream
- C++将目录中的所有文件与::filesystem进行比较
- std::带有自定义缓冲区的 iostream 不允许我写入
- <filesystem> 在 clang 6 和 10 上 #include 错误
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- 新的放置取决于 iostream
- 包含在 <initializer_list> <iostream>?
- 为什么在包含iostream时可以使用printf()?
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- 如何将 std::filesystem::p ath 转换为 LPCSTR,以便在 LoadLibrary() 变体之一
- 无法使用<filesystem>函数
- 如果 iostream 对象不可复制,为什么以下代码是合法的?
- 不能将C++的"std::filesystem"库与介子构建一起使用
- 为什么我必须在包含后写 std::cin <iostream>?
- Visual Studio 2019 C++ and std::filesystem
- 如何将带有空字符的字节数组馈送到 std::iostream 中?
- iostream GCC错误,转换为boost::filesystem::iostream for Windows