C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型

C++ wifstream: Incompatible type char const*, wchar_t const*

本文关键字:wchar 康斯特 类型 C++ 不兼容 字符常量 wifstream      更新时间:2023-10-16

我在这里遵循DirectX 3D模型加载教程,并且正在测试代码的一小部分。要加载我的 .obj 文件,我需要使用宽文件流,并且教程提示初始化一个新流,我需要传入宽字符串。

我有点偏离教程,因为我希望将演示的串行实现转换为简洁的 OO 包,但是当我尝试初始化我的 file 变量进行读取时,我遇到了incompatible type char const* to wchar_t const*错误

如何解决此问题?

class Stream {
private:
    std::wifstream file;
public:
    bool open_file(std::wstring &filename) {
        file = std::wifstream(filename.c_str());    // error thrown here.
    }
};

从 main 调用 open 函数。

std::wstring filename = "test_read.txt";
if(d.open_file(filename))
{
    // Do read processing here
}

提前谢谢。

首先,您正在尝试分配一个流,但您无法这样做。流不是容器,而是数据流。因此,它们不能被复制或分配给。相反,您可以使用流对象的open成员函数:

class Stream {
private:
    std::wifstream file;
public:
    bool open_file(std::wstring &filename) {
        file.open(filename.c_str());
    }
};

然后我们回到文件名的问题。您正在阅读的教程是错误的。以下重载可用于所有basic_ifstream实例化:

void open( const char *filename,
           ios_base::openmode mode = ios_base::in );
void open( const std::string &filename,                                  
           ios_base::openmode mode = ios_base::in );

也就是说,无论流的CharT如何,文件名都只接受诚实的上帝const char*std::string

本教程很可能基于 Microsoft 标准库实现提供的非标准扩展做出了假设,这增加了占用const wchar_t*的重载。如果要编写可移植代码,请忽略这些重载。

最后,您当前没有从 open_file 返回任何内容,这会导致未定义的行为。

更正后的代码应如下所示:

class Stream {
private:
    std::wifstream file;
public:
    bool open_file(const std::string& filename) {
        file.open(filename);    // file.open(filename.c_str()) in C++03
        return file.is_open();
    }
};

std::wifstream在其构造函数中采用const char*。 您不能将c_strwstring传递给它,因为wstring会返回const charT*。 这些类型不兼容。