静态const模板成员初始化因MSVC而失败

时间:2013-10-29 19:35:38

标签: c++ visual-c++ c++11

使用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;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

即使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。希望一些勇敢的人会弹出并给我们一个标准条款的链接;)

P.S。至少非模板化版本工作正常;)

struct StringHolder
{
    static const std::string str;
};

const string StringHolder::str{ "integer" };

P.P.S。模板化,非专业版甚至不编译^ _ ^

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>'

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

答案 1 :(得分:0)

据我所知,MS VC ++ 2010不支持初始化列表。似乎VC ++ 2012也不支持它们。