g ++ не позволит мне передать параметр шаблона в offsetof - PullRequest
2 голосов
/ 17 марта 2011

При использовании 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 ]

1 голос
/ 07 сентября 2011

Если бы здесь была такая же проблема, offsetof не работает с шаблонными классами.

Для быстрого решения этой проблемы просто создайте фиктивный объект этого типа и рассчитайте смещение, вычитая адреса:

SomeClass<int> dummy ;
const size_t offset =  ( (char*)(&dummy.t) ) - ( (char*) &dummy ) ; 
1 голос
/ 20 марта 2011

Данные о членах должны быть открытыми, поэтому используйте 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;
}


edit: извините, я неправильно понял ваш вопрос, поэтому я изменил ответ + lt & gt

...