MSVC链接错误,但constexpr的g ++链接错误

时间:2018-09-25 14:57:06

标签: c++ gcc visual-c++ c++17

考虑以下代码:

#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 :(得分:2)

  

这是MSVC中的错误吗?

否,FactoryTag::shape在这里是 odr用过的,因此它需要一个定义(您正在复制构造它,它通过隐式生成的复制构造函数,这需要您进行以下操作:绑定参考)。可以说,这也不是gcc中的错误,因为如果缺少定义,就会出现no diagnostic required

解决方案是添加定义。旧的方法是:

struct FactoryTag { ... };

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

新方法是:

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