Visual Studio размер недопустимого операнда - PullRequest
3 голосов
/ 11 февраля 2012

В настоящее время я портирую программу, разработанную для Linux, на Win32.Среди других проблем у меня есть довольно странная проблема.Заголовочный файл содержит что-то вроде этого:

namespace Networking {
  struct  MetaStruct
  {
    int   iDataType;
    int   iDataSize;
    void* pData;
  };

  const int MetaStructSize = sizeof(MetaStruct) - sizeof(MetaStruct::pData);
};

Это нормально компилируется на Linux, но я получаю эту ошибку при компиляции для Win32 с использованием VS2010: Networking.hpp(50): error C2070: '': illegal sizeof operand

Я попытался добавитьNetworking:: до MetaStruct, но это ничего не меняет.Странно то, что VS2010 дает мне правильное значение sizeof, когда я наводю его мышью, но не собираю его.Почему?

1 Ответ

9 голосов
/ 11 февраля 2012

В C ++ 03 Существует две формы выражений sizeof (см. ИСО / МЭК 14882: 2003 5.3.3 [expr.sizeof]).

sizeof unary-expression
sizeof ( type-id )

MetaStruct::pData не является допустимым выражением(преобразование в тип объекта) или имя типа.

Вам нужно будет сделать

sizeof( void* )

или

sizeof MetaStruct().pData

Обновление: спасибо@hvd, который указывает, что сейчас это должно быть действительно допустимо в C ++ 11.

Теперь вы можете использовать id-выражение , которое ссылается на нестатический член классав тех случаях, когда это не оценивается.Очевидно, это не поддерживается VS2010.

Существует также новая форма sizeof в C ++ 11: sizeof ... ( identifier ), но она здесь не актуальна.

...