使用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得到了同样的错误。有什么想法吗?
由于
答案 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 ) ;