gpt4 book ai didi

c++ - 模板流运算符重载错误: invalid reference initialisation to do with differences between basic_istream and basic_ifstream

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:43 25 4
gpt4 key购买 nike

我在图像处理的上下文中学习 IO,这是我第一次不得不将流用于二进制文件而不是格式化/文本文件。我正在尝试使用带有模板编程的重载流插入运算符将位图的前 14 个字符读入结构。

#include <cstdint>
#include <iostream>
#include <fstream>
#include <string>

// a struct for the first 14 bytes
struct bmp_header {
// ordered by size (not their order in the file) for efficient packing
uint32_t size_, pixel_data_offset_;
uint16_t reserved_1_, reserved_2_;
char header_field_[2];
};

// overload stream extraction
template<typename... Args, typename istream_type = std::basic_istream<Args...>>
istream_type &operator>>(istream_type &is, bmp_header &hdr) {
return is >> hdr.header_field_[0] >> hdr.header_field_[1] >> hdr.size_ >> hdr.reserved_1_ >> hdr.reserved_2_ >> hdr.pixel_data_offset_;
}

int main(){
// open the stream
std::string ifname {"images/cameraman.bmp"};
std::ifstream ist {ifname, std::ios::in | std::ios::binary};

// instantiate the struct
bmp_header myHeader;

// read into the struct
ist >> myHeader; // error

ist.close();
return 0;
}

我的编译器(g++)给出错误:

new.cpp: In instantiation of ‘istream_type& operator>>(istream_type&, bmp_header&) [with Args = {}; istream_type = std::basic_ifstream<char>]’:
new.cpp:29:10: required from here
new.cpp:17:119: error: invalid initialization of reference of type ‘std::basic_ifstream<char>&’ from expression of type ‘std::basic_istream<char>::__istream_type’ {aka ‘std::basic_istream<char>’}
return is >> hdr.header_field_[0] >> hdr.header_field_[1] >> hdr.size_ >> hdr.reserved_1_ >> hdr.reserved_2_ >> hdr.pixel_data_offset_;
^~~~~~~~~~~~~~~~~~

我不确定如何解释此错误消息。我知道std::fstreamstd::iostream不兼容 see this related question ,但我不明白它是否告诉我运算符(operator)期待 std::basic_ifstream<char>&并获得了 std::basic_istream<char>反之亦然。

我也不确定如何解决这个问题。我试过从

template<typename... Args, typename istream_type = std::basic_istream<Args...>>

template<typename... Args, typename istream_type = std::basic_ifstream<Args...>>

但它并没有改变错误信息。

如果有人能指出正确的方向,我将不胜感激。我不确定我是否应该尝试从不同的流类型读取数据,或者我是否应该修改我的流运算符的规范或模板以使其与我当前的流类型兼容。

提前致谢!

最佳答案

问题在于,在您的代码中,此表达式的类型:

is >> hdr.header_field_[0] >> ...

std::istream&。然后,在 return 语句中,您尝试通过上述类型表达式初始化 std::ifstream& (derived) 类型的返回值std::istream& (base),这是不可能的。试试这个例子来产生完全相同的错误:

std::ifstream f;
std::istream& ref1 = f; // OK
std::ifstream& ref2 = ref1; // ERROR

一个简单的补救措施是将代码分成两行:

is >> hdr.header_field_[0] >> ...;
return is;

另一种选择是向下转型istream_type&,但是,这里的语法太复杂了(IMO)。

关于c++ - 模板流运算符重载错误: invalid reference initialisation to do with differences between basic_istream and basic_ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com