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 '<end Parse>'
希望他们会在服务包中修复它。
【讨论】:
这个编译器错误仍然存在于 VS2015 Update 3 工具链中。 VS2017我没试过。【参考方案2】:据我所知 MS VC++ 2010 不支持初始化列表。看来VC++ 2012也不支持了。
【讨论】:
VC++ 2013 可以,但是。以上是关于MSVC 导致静态 const 模板成员初始化失败的主要内容,如果未能解决你的问题,请参考以下文章