2

使用 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 得到了同样的错误。有任何想法吗?

谢谢

4

2 回答 2

1

成员数据必须是公开的,所以使用 public 或 struct

模板 <类型名 T>
类SomeClass {
上市:
    吨;
};
...
offsetof(SomeClass<double>, t);

请注意,预处理器总是尝试以逗号分隔参数,因此使用 typedef 作为解决方法。

#include <cstddef>

模板 <类型名 T1,类型名 T2>
类SomeClass {
上市:
    T1 t1;
    T2 t2;
};

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

    返回0;
}


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

于 2011-03-19T21:43:34.303 回答
1

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

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

SomeClass<int> dummy ;
const size_t offset =  ( (char*)(&dummy.t) ) - ( (char*) &dummy ) ; 
于 2011-09-07T10:01:00.567 回答