sizeof()和模板参数在ctor / Non-ctor函数中

时间:2009-08-24 16:29:37

标签: c++ constructor templates sizeof arguments

我今天遇到了麻烦......我想定义一个小模板助手类:

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

当然,它不会编译(C2027)。我的问题是,是否有可能获得该类型的大小?我需要这个的原因是构造对象的类型可能是许多不同定义的结构,因此我需要在运行时获得所用结构的大小。

通过一些快速的实验,因为我很顽固,似乎我可以在ctor中使用sizeof(T),而不是在非ctor函数中 - 所以现在我的问题也就是为什么?!

3 个答案:

答案 0 :(得分:2)

似乎在这里工作正常,C2027的信息是什么?您使用的编译器是什么?

答案 1 :(得分:2)

它可能有不同的原因。请考虑以下代码:

// 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;
};

在构造函数实例化时(在“.cpp”文件中),T是完全定义的类型。但是在实例化GetElementSize时(在“.h”文件中),X尚未完全定义。

答案 2 :(得分:1)

不确定问题的正确答案是什么,但似乎你可以通过让iSize成为成员并让GetElementSize()返回它而不是再次调用sizeof来解决它。