gpt4 book ai didi

c++ - 模板类型参数的 Sizeof 成员变量

转载 作者:太空狗 更新时间:2023-10-29 20:40:20 25 4
gpt4 key购买 nike

我想为我作为模板参数传递给函数的结构类型确定一个特定的成员变量 sizeof。然而,我从编译器那里得到一个错误,指出 sizeof 操作数是非法的(我在 Windows 7 上使用 VS2010)。

考虑以下程序:

#include <vector>
#include <fstream>

struct MyFloat {
float val;
MyFloat(){val=rand()/(RAND_MAX+1.f);};
};
struct MyDouble {
double val;
MyDouble(){val=rand()/(RAND_MAX+1.);};
};

template<class T>
void serializeArrayToFile(const std::string &filename, const std::vector<T> &items) {
const size_t nbytes = sizeof(T::val); // <--- Error C2070
std::ofstream os(filename.c_str(),std::ios::out+std::ios::binary);
for(size_t i=0; i<items.size(); ++i)
os.write((char*)(&items[i].val),nbytes);
os.close();
};

void main() {
const int N = 15;
std::vector<MyFloat> arr_float(N); // Filled randomly by default constructor
std::vector<MyDouble> arr_double(N); // Filled randomly by default constructor
serializeArrayToFile<MyFloat>("myfloat_array.dat",arr_float);
serializeArrayToFile<MyDouble>("mydouble_array.dat",arr_double);
}

这会产生以下错误: 错误 C2070:“”:操作数的大小不合法。

有人可以解释为什么 sizeof(T::val) 是非法的,以及我应该如何确定 sizeof T::val,考虑到输入 vector 可能为空?

最佳答案

sizeof 应用于没有对象命名的非静态数据成员是 C++11 的特性;它在 paper n2253 中被引入语言中.符合标准的 C++03 编译器将不允许这种用法;如果可能,您应该看看是否可以使用符合标准的 C++11 编译器。

[请注意,与那篇论文相反,最终的 C++11 标准实际上允许使用 sizeof(S::m + 42);我不确定那是什么时候改变的。]

一般的解决方法是取消引用空指针(在非评估上下文中有效):

sizeof(((T*) 0)->val)

但是,您有一个 T 类型的对象可用,因此可以这样写:

sizeof(items.front().val)

即使 vector 为空,这也是有效的,因为 sizeof 是一个未计算的上下文,所以实际上不会调用 front()

关于c++ - 模板类型参数的 Sizeof 成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24527333/

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