1

以下示例代码可以在 VC++ 2019、clang++ 和 g++ 中编译,但不能在 VC++ 2015 中编译。

namespace ns
{
    template<const char* str>
    struct Foo
    {
    };
    
    static const char name[] = "Test";
    Foo<name> foo;
}

int main()
{
}

VC++ 2015 有什么解决方法吗?我假设代码符合要求,但 VC++ 2015 有一个错误,该错误已在 VC++ 2019 中修复。我会迁移到 VC++ 2019,但我的公司是在 VC++ 2015 中构建的。

4

2 回答 2

1

MSVC 2015 不完全支持 C++11,具有内部链接的非类型模板参数是 VC++ 直到版本 14.14(VS 2017 15.8)才支持的 C++11 功能的一个示例。

我可以想到3个解决方案:

  • 不要通过删除static const说明符来使用带有内部链接的模板参数char name[]
  • 将编译器升级到 VC++ 14.20+ (MSVC 2019)
  • 使用特征检测和/或条件编译

关于条件编译,可以这样实现:

#if !defined(_MSC_VER) || _MSC_VER > 1914 // this part can be in a global config.h
#  define INTERNAL static const
#else
#  define INTERNAL 
#endif

namespace ns
{
    template<const char* str>
    struct Foo
    {};
    
    INTERNAL char name[] = "Test";
    Foo<name> foo;
}

int main()
{
}
于 2020-11-02T12:06:21.543 回答
1

正如评论中提到的,问题在于 VS-2015 不符合 C++11 标准,这是实现您显示的代码所必需的。

查看此报告中如何描述该问题,我发现解决该问题的唯一方法是删除您声明中的staticconst限定符name。即使使用 VS-2010 构建工具也可以编译以下内容(我无法在我的 PC 上访问 VS-2015 工具,但是,由于这适用于 VS-2010 和 VS-2019,我认为它在VS-2015)。

namespace ns {
    template<const char* str>
    struct Foo {
    };

    char name[] = "Test"; // Adding either "static" or "const" causes C2970
    Foo<name> foo;
}

int main()
{
}

此解决方法是否适合您的需求还有待观察。

于 2020-11-02T11:30:13.113 回答