2 Stimmen

g++ lässt nicht zu, dass ich einen Template-Parameter an offsetof übergebe

Wenn ich g++ verwende, übergebe ich einen Template-Parameter als Member-Variable an offsetof und erhalte die folgende Warnung:

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

So sieht meine Nutzung aus:

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)

Ich erhalte den gleichen Fehler mit __builtin_offsetof. Irgendwelche Ideen?

Danke

1voto

Stan Prokop Punkte 4853

Die Mitgliederdaten müssen öffentlich sein, also verwenden Sie public oder struct

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

Beachten Sie, dass der Präprozessor immer versucht, die Argumente an einem Komma zu trennen, verwenden Sie daher eine typedef als Abhilfe.

#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: Entschuldigung, ich habe Ihre Frage missverstanden, daher habe ich die Antwort geändert + lt & gt

1voto

hasvn Punkte 1016

Hatte das gleiche Problem hier, offsetof funktioniert nicht mit Vorlagenklassen.

Ein schneller Hack zur Lösung dieses Problems ist die Erstellung eines Dummy-Objekts dieses Typs und die Berechnung des Offsets durch Subtraktion der Adressen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X