【问题标题】:sizeof() And Template Argument In ctor / Non-ctor Functionsizeof() 和 ctor / Non-ctor 函数中的模板参数
【发布时间】:2010-11-22 08:16:13
【问题描述】:

我今天遇到了一个障碍......我想定义一个小的模板化帮助类:

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 函数中使用 - 所以我现在的问题也就是为什么?!

【问题讨论】:

  • 您真的尝试过编译这段代码吗?它在template&lt; class T &gt;CMyClass 之间缺少classstruct。如果你添加class,gcc 就可以编译好了。
  • 另外,试试“std::size_t”。构造函数中的代码似乎可以工作,但通常在创建CMyClass&lt;T&gt; 的对象时实例化构造函数之前不会编译它。

标签: c++ constructor templates sizeof arguments


【解决方案1】:

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

【讨论】:

  • 我最后确实发现了这一点,虽然我也发现当我尝试将相关代码提取到一个小例子时,它不再失败。
【解决方案2】:

这里似乎工作正常,C2027 的消息是什么?你用的是什么编译器?

【讨论】:

  • 我使用的是 VS2005,打了补丁 - 我相信它被命名为 VC8 或 VC8.1?完整的错误文本是: myclass.h(170) : error C2027: use of undefined type 'T' see declaration of 'T' while compile class template member function 'size_t CMyClass::GetElementSize(void) const' with [ T=T ] 请参阅对使用 [ T=T ] 编译的类模板实例化 CMyClass' 的引用,并使用 CMyClass ElementStore 对其进行实例化;其中 SOME_STRUCT_DEF 包含三个浮点数和一个 DWORD + 它自己的 ctor。
  • 其实我必须撤回这个问题。它似乎并非在所有情况下都会发生 - 特别是当我尝试提取裸露的骨骼并创建可编译的测试样本时,它并没有发生。咕噜!
【解决方案3】:

这可能有不同的原因。考虑这段代码:

// 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 尚未完全定义。

【讨论】:

  • @litb:我认为该错误需要两阶段查找,而“C2027”暗示 VC——不幸的是,它没有实现这一点。
  • 我不确定 VC 的任何事情。那个编译器太坏了,我无法假设它:)
  • @sbi:这里没有两阶段查找。两阶段查找是用于描述在参数类型范围内发生的查找的术语,用于涉及依赖参数的函数调用。
  • @litb:我认为根据“Kim Grasman”对答案的评论中的错误消息,您在此处提供了正确答案。
猜你喜欢
  • 2016-07-25
  • 2022-01-08
  • 2011-02-17
  • 1970-01-01
  • 2015-03-23
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多