Ошибка связи с MSVC, но не с g ++ с constexpr - PullRequest
0 голосов
/ 25 сентября 2018

Рассмотрим следующий код:

#include <iostream>

struct FactoryTag
{
    static struct Shape {} shape;
    static struct Color {} color;
};

template <typename TFactory>
int factoryProducer(TFactory tag)
{
    if constexpr (std::is_same<TFactory, FactoryTag::Shape>::value)
        return 12;
    else if constexpr (std::is_same<TFactory, FactoryTag::Color>::value)
        return 1337;
}

int main()
{
    std::cout << factoryProducer(FactoryTag::shape) << std::endl;
    return 0;
}

Он отлично работает с g++ -std=c++1z Main.cpp, но в Visual Studio с MSVC, установленным с поддержкой c ++ 17, он дает

Error   LNK2001 unresolved external symbol "public: static struct FactoryTag::Shape FactoryTag::shape" (?shape@FactoryTag@@2UShape@1@A) StaticTest  C:\Users\danielj\source\repos\StaticTest\StaticTest\StaticTest.obj  1   

Этоошибка в MSVC?

1 Ответ

0 голосов
/ 25 сентября 2018

Это ошибка в MSVC?

Нет, FactoryTag::shape используется odr-используется здесь, так что вам нужно определение (вы копируетеего создание, которое проходит через неявно сгенерированный конструктор копирования, который требует привязки ссылки).Возможно, это и не ошибка в gcc, поскольку не требует диагностики , если определение отсутствует.

Решение состоит в том, чтобы добавить определение.Старый способ будет:

struct FactoryTag { ... };

Shape FactoryTag::shape{}; // somewhere in a source file

Новый способ будет:

struct FactoryTag {
    struct Shape {} static constexpr shape {}; // implicitly inline in C++17
};
...