constexpr static std :: array <const char *, 5> не удалось скомпилировать с MSVC2013 - PullRequest
3 голосов
/ 03 апреля 2019

У меня есть этот код:

#include <array>
#include <iostream>

class ExternalGeometryExtension
{
public:
    enum Flag {
        Defining = 0,
        Frozen = 1, 
        Detached = 2,
        Missing = 3,
        Sync = 4,
        NumFlags
    };

    constexpr static std::array<const char *,NumFlags> flag2str{{ "Defining", "Frozen", "Detached","Missing", "Sync" }};
};

int main()
{
    std::cout << ExternalGeometryExtension::flag2str[ExternalGeometryExtension::Frozen] << std::endl;
    return 0;
}

Прекрасно компилируется с: Clang версии 5.0.0 и gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3) 4.8.4

Не удается скомпилировать с MSVC2013.

Ошибка компиляции:

 C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2144: syntax error : 'int' should be preceded by ';' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2146: syntax error : missing ';' before identifier 'flag2str' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2838: 'array<char const *,5>' : illegal qualified name in member declaration [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2143: syntax error : missing ';' before '{' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2334: unexpected token(s) preceding '{'; skipping apparent function body [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod\Sketcher\App\ExternalGeometryExtension.cpp(36): error C2143: syntax error : missing ';' before 'std::array<const char *,0x05>' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod\Sketcher\App\ExternalGeometryExtension.cpp(36): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod\Sketcher\App\ExternalGeometryExtension.cpp(36): error C2039: 'flag2str' : is not a member of 'Sketcher::ExternalGeometryExtension' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         c:\projects\freecad\src\mod\sketcher\app\ExternalGeometryExtension.h(47): error C2144: syntax error : 'int' should be preceded by ';' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         c:\projects\freecad\src\mod\sketcher\app\ExternalGeometryExtension.h(47): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         c:\projects\freecad\src\mod\sketcher\app\ExternalGeometryExtension.h(47): error C2146: syntax error : missing ';' before identifier 'flag2str' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         c:\projects\freecad\src\mod\sketcher\app\ExternalGeometryExtension.h(47): error C2838: 'array<char const *,5>' : illegal qualified name in member declaration [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         c:\projects\freecad\src\mod\sketcher\app\ExternalGeometryExtension.h(47): error C2143: syntax error : missing ';' before '{' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         c:\projects\freecad\src\mod\sketcher\app\ExternalGeometryExtension.h(47): error C2334: unexpected token(s) preceding '{'; skipping apparent function body [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2144: syntax error : 'int' should be preceded by ';' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2146: syntax error : missing ';' before identifier 'flag2str' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2838: 'array<char const *,5>' : illegal qualified name in member declaration [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2143: syntax error : missing ';' before '{' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod/Sketcher/App/ExternalGeometryExtension.h(47): error C2334: unexpected token(s) preceding '{'; skipping apparent function body [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]
         C:\projects\freecad\src\Mod\Sketcher\App\ExternalGeometryExtensionPyImp.cpp(67): error C2039: 'flag2str' : is not a member of 'Sketcher::ExternalGeometryExtension' [C:\projects\freecad\build\src\Mod\Sketcher\App\Sketcher.vcxproj]

Полный вывод компилятора здесь

Мои вопросы: Что я делаю не так? Почему он не компилируется с MSVC2013?

Что я могу сделать, чтобы этот код работал с MSVC2013, не нарушая его в других компиляторах?

РЕДАКТИРОВАТЬ: я изменил код так, чтобы это был минимальный, полный и проверяемый пример по запросу Тоби Спейта, основанный на правильном предположении о Диодакусе. Я не могу произвести вывод ошибок этого конкретного кода, потому что у меня нет копии MSVC2003. Я работаю с открытым исходным кодом, FreeCAD, который предлагает поддержку Windows. Я использую Linux. В любом случае ошибки в выводе соответствуют коду, который я показываю. Это результат теста AppVeyor перед интеграцией. Код проходит Linux CI нормально. Я постараюсь максимально использовать этот вопрос, но я надеюсь, что он полезен для других.

РЕДАКТИРОВАТЬ 2: Я понял, что инициализация двойной скобкой подняла некоторые брови. Из примера в cppreference :

двойные скобки требуются в C ++ 11 до ревизии CWG 1270 (не требуется в C ++ 11 после пересмотра и в C ++ 14 и более поздних версиях)

Без двойных скобок сбой gcc 4.8.

Ответы [ 2 ]

8 голосов
/ 03 апреля 2019

Согласно этому microsoft devblog , constexpr - это одна из основных функций языка C ++ 11, которая не поддерживается в VS 2013. И только частично поддерживается в «CTP-версии ноября 2013».

0 голосов
/ 03 апреля 2019

Хорошо, рассматриваемый код компилируется с опцией C ++ 17:

#include <array>
#include <iostream>

class ExternalGeometryExtension
{
public:
    enum Flag {
        Defining = 0,
        Frozen = 1, 
        Detached = 2,
        Missing = 3,
        Sync = 4,
        NumFlags
    };

    constexpr static std::array<const char *,NumFlags> flag2str{{ "Defining", "Frozen", "Detached","Missing", "Sync" }};
};

int main()
{
    std::cout << ExternalGeometryExtension::flag2str[ExternalGeometryExtension::Frozen] << std::endl;
    return 0;
}

И нет необходимости повторно объявлять статическую переменную вне класса.

@ Abdullah Tahiri Пожалуйстаиспользуйте конструкции C ++ 11 (как указано в метках вопросов) или используйте C ++ 17 для всех функций.Но я боюсь, что MSVC может быть проблематичным с кодом.Есть ли какая-то особая причина, по которой вы не можете использовать GCC или CLang в Windows?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...