6

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

有任何想法吗?

4

2 回答 2

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

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

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

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

PPS 模板,非专业版本甚至无法编译 ^_^

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

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

于 2013-10-29T22:09:30.790 回答
0

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

于 2013-10-29T19:39:21.210 回答