2011-03-17 6 views
2

グラムを使用している場合++メンバ変数がoffsetofはするとして、私はテンプレートパラメータを渡し、私は次の警告を取得offsetofはために私は、テンプレートパラメータを渡すことはできません。グラム++

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

ここではどのような私の使用方法のルックスですがlike:

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を使用して同じエラーが発生します。何か案は?

おかげ

答えて

1

会員データがパブリックで、そうなかれカンマで引数を分割しようとするので、回避策としてのtypedefを使用するプリプロセッサ公共または構造体

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

注意を使用する必要があります。

 
#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 & GT

1

を変更したがoffsetofははテンプレートクラスでは動作しません、ここでは同じ問題を抱えていました。ちょうどそのタイプのダミーオブジェクトを作成し、住所がを減算することによりオフセットを計算し、これを解決する迅速なハックとして

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