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

标签 c++ templates sizeof

我想为我作为模板参数传递给函数的结构类型确定一个特定的成员变量 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/

相关文章:

c++ - double 和其他 float

c++ - 按键排序 std::unordered_map

html - 去html模板表

c++ - 初始化后可以调整 C++ 数组的大小吗?

c++ - 知道变量占用多少内存的正确方法是什么

c - 如何声明一个占用内存段中所有可用空间的 C 数组?

c++ - 我应该包含包含在另一个标题中的文件吗?

c++ - C++服务的自动延迟启动

C++ 模板化类对不完整类的无效使用

Mac 上的 Java 项目模板?