MSVC 导致静态 const 模板成员初始化失败

Posted

技术标签:

【中文标题】MSVC 导致静态 const 模板成员初始化失败【英文标题】:Static const template member initialization fails with MSVC 【发布时间】:2013-10-29 19:35:38 【问题描述】:

我在使用 MSVC 编译器时在模板类上初始化静态 const 变量时遇到问题。我试过 MSVC2013、MSVC2012 和 MSVC2010。此代码适用于 MinGW、MinGW-w64、GCC 和 Clang。

#include <iostream>
#include <string>

using namespace std;

template <typename T>
struct StringHolder

    static const std::string str;
;

template<> const string StringHolder<int>::str  "integer" ;

int main()

    // prints nothing when compiled with MSVC2013, works with MinGW/GCC/Clang
    cout << StringHolder<int>::str << endl;

    return 0;

有什么想法吗?

【问题讨论】:

【参考方案1】:

即使 MSVC2013 仍然存在统一初始化问题:str "integer"

要使其与 M$VC 一起使用,请使用 vanilla 语法:

template<> const string StringHolder<int>::str = "integer";

template<> const string StringHolder<int>::str("integer");

template<> const string StringHolder<int>::str = "integer";

我不确定 GCC 还是 Studio 更符合标准。希望一些勇敢的人会弹出并给我们一个标准条款的链接;)

附:至少非模板版本可以正常工作;)

struct StringHolder

    static const std::string str;
;

const string StringHolder::str "integer" ;

附言模板化的非专业版本甚至无法编译^_^

template <typename T>
struct StringHolder

static const std::string str;
;

template <typename T>
const std::string StringHolder<T>::str "integer" ;

xmemory0(611): error C2143: syntax error : missing ';' before '&lt;end Parse&gt;'

希望他们会在服务包中修复它。

【讨论】:

这个编译器错误仍然存​​在于 VS2015 Update 3 工具链中。 VS2017我没试过。【参考方案2】:

据我所知 MS VC++ 2010 不支持初始化列表。看来VC++ 2012也不支持了。

【讨论】:

VC++ 2013 可以,但是。

以上是关于MSVC 导致静态 const 模板成员初始化失败的主要内容,如果未能解决你的问题,请参考以下文章

SFINAE模板类复杂类型的静态成员定义

C++ 静态 const 类成员初始化

局部静态的线程安全初始化:MSVC [重复]

将 const char[] 初始化为非静态类成员

statuc和const

我可以在C ++中的运行时初始化静态const成员吗?