g ++不允许我将模板参数传递给offsetof

时间:2011-03-17 18:59:06

标签: templates g++ offsetof

使用g ++时,我将模板参数作为成员变量传递给offsetof,我收到以下警告:

invalid access to non-static data member 'SomeClass::t' of NULL object
(perhaps the 'offsetof' macro was used incorrectly)

以下是我的用法:

template<typename T> class SomeClass { T t; };
...
offsetof(SomeClass, t); //warning: invalid access to non-static data member 'SomeClass::t' of NULL object, (perhaps the 'offsetof' macro was used incorrectly)

我使用__builtin_offsetof得到了同样的错误。有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

会员数据必须是公开的,因此请使用public或struct

template <typename T>
class SomeClass {
public:
    T t;
};
...
offsetof(SomeClass<double>, t);

请注意,预处理器总是尝试用逗号分割参数,因此请使用typedef作为变通方法。

#include <cstddef>

template <typename T1, typename T2>
class SomeClass {
public:
    T1 t1;
    T2 t2;
};

int main(int,char**) {
    typedef SomeClass<double, float> SomeClassDoubleFloat;
    offsetof(SomeClassDoubleFloat, t2);

    return 0;
}


编辑:对不起,我误解了你的问题,所以我改变了答案+ lt&amp; amp; GT

答案 1 :(得分:1)

这里有同样的问题,offsetof不适用于模板化的类。

作为解决此问题的快速方法,只需创建该类型的虚拟对象,并通过减去地址来计算偏移量:

SomeClass<int> dummy ;
const size_t offset =  ( (char*)(&dummy.t) ) - ( (char*) &dummy ) ;