2009-08-24 7 views
0

で私は小さなテンプレートヘルパークラスを定義したかった...今日は暗礁に乗り上げる:はsizeof()とテンプレート引数のctor /非CTOR機能

template<class T> 
CMyClass 
{ 
public : 
    CMyClass() { size_t iSize = sizeof(T); } // Allowed. 
    size_t GetElementSize() const { return sizeof(T); } // C2027. 
}; 

そしてもちろん、それがコンパイルされないでしょう(C2027)。私の質問は、タイプのサイズを取得することは可能ですか?私が必要とするのは、オブジェクトが構築される型が、さまざまに定義された構造体である可能性があるため、実行時に、使用する構造体のサイズを取得する必要があるからです。実験の迅速なビットを通じて

私は頑固だから、私ctorのではなく、非CTOR機能でができ使用はsizeof(T)と思われる - ので、私の質問は今あります...なぜ?!

+3

このコードをコンパイルしてみましたか? 'template < class T >'と 'CMyClass'の間に' class'や 'struct'がありません。 'class'を追加すると、gccはちょうどうまくコンパイルされます。 – Tobias

+0

また、 "std :: size_t"を試してください。コンストラクタ内のコードは動作しているように見えるかもしれませんが、 'CMyClass 'のオブジェクトを作成するときにコンストラクタがインスタンス化されるまで通常はコンパイルされません。 –

答えて

1

あなたの質問に対する適切な答えはわかりませんが、iSizeをメンバーにしてGetOlementSize()にsizeofを再度呼び出さずに返すことで回避できます。

+0

これを最後に発見しましたが、小さなコードに関連するコードを試してみると、もはや失敗しないことがわかりました。 – JTeagle

2

ここでうまくいくと思われますが、C2027のメッセージは何ですか?コンパイラはどのようなものを使用していますか?

+0

私はVS2005を使用しています、パッチを当てました - 私はそれがVC8かVC8.1という名前だと思いますか? フルエラーテキストがある: myclass.h(170):エラーC2027:CMyClass size_tのクラステンプレートメンバ関数」をコンパイルしながら不定型の使用 'T' は 'T' の宣言を参照:: GetElementSize(ボイド)CONST ' と [ T = Tは ] CMyClass クラステンプレートのインスタンスへの参照を参照' [ T = T ] と をコンパイルされると、それは でインスタンス化されました\t CMyClass ElementStore; ここで、SOME_STRUCT_DEFには3つの浮動小数点数とDWORD +独自のctorが含まれています。 – JTeagle

+0

Yikes、そこに書式設定の損失について申し訳ありません。 – JTeagle

+0

実際、私は質問を取り下げる必要があります。すべての場合、特に裸の骨を抽出してコンパイル可能なテストサンプルを作成しようとすると、それは起こっていません。 Grrr! – JTeagle

2

これにはさまざまな理由があります。このコードを考えてみてください(「.CPP」ファイル内の)コンストラクタがインスタンス化されるとき

// file foo.h 
class X; 

template<class T> 
class CMyClass 
{ 
public : 
    CMyClass() { size_t iSize = sizeof(T); } // Allowed. 
    size_t GetElementSize() const { return sizeof(T); } // C2027. 
}; 

struct Class { 
    Class(); // definition of it in the cpp file, where "X" is fully defined 
    void callit() { cm.GetElementSize(); } // instantiated here! 
    CMyClass<X> cm; 
}; 

を、Tは完全に定義されたタイプです。しかしGetElementSizeが( ".h"ファイルで)インスタンス化されるとき、Xはまだ完全には定義されていません。

+0

@litb:私はエラーが2段階のルックアップを必要とすると思いますが、 "C2027"はVCを暗示していますが、残念ながらこれを実装していません。 – sbi

+0

私はVCに関して何かについてはわかりません。そのコンパイラは私にとって何かを引き受けるにはあまりにも壊れています:) –

+0

@sbi:ここには2フェーズルックアップはありません。2フェーズルックアップは、引数型のスコープ内で、依存する引数を含む関数呼び出しのルックアップを記述するための用語です。 –

関連する問題