sizeof () и аргумент шаблона в функции ctor / non-ctor - PullRequest
0 голосов
/ 24 августа 2009

Сегодня я наткнулся на препятствие ... Я хотел определить небольшой шаблонный вспомогательный класс:

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

и, конечно, он не скомпилируется (C2027). Мой вопрос был, возможно ли получить размер шрифта? Причина, по которой мне это нужно, заключается в том, что тип объекта, с которым создается объект, может представлять собой несколько различных структур, и поэтому мне нужно получить размер используемой структуры во время выполнения.

После небольшого эксперимента, потому что я упрям, кажется, что я могу использовать sizeof (T) в ctor, но не в функции без ctor - поэтому мой вопрос сейчас ... Зачем?!

Ответы [ 3 ]

2 голосов
/ 24 августа 2009

Кажется, что здесь хорошо работает, что за сообщение C2027? А какой компилятор вы используете?

2 голосов
/ 24 августа 2009

У этого могут быть разные причины. Рассмотрим этот код:

// 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 еще не определен полностью.

1 голос
/ 24 августа 2009

Не уверен, каков правильный ответ на ваш вопрос, но, похоже, вы можете обойти его, просто сделав iSize членом и заставив GetElementSize () вернуть его вместо повторного вызова sizeof.

...