gpt4 book ai didi

templates - C++11 MSVS vs GCC 静态成员初始化中模板参数名称的可见性

转载 作者:行者123 更新时间:2023-12-03 08:02:57 25 4
gpt4 key购买 nike

我只想问为什么 MSVS2013 提示此代码与 GCC(至少 4.8.3)不同:

template <typename T>
struct MyClass
{
typedef std::function<T*()> FunctionType;
static FunctionType funcObj;
};

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
[]{return new T();};

在 msvs2013 中,它会提示:错误 1 ​​错误 C2061:语法错误:标识符“T”

为了修复,我必须将其修改为:

template <typename T>
struct MyClass
{
typedef std::function<T*()> FunctionType;
static FunctionType funcObj;

static T* foo()
{
return new T();
}
};

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
MyClass<T>::foo;

注意:'MyClass < T >::' 在最后一行不是必需的。我只是想暗示 T 在操作的右侧(待分配)仍然可用,而当 T 在 lambda 内部时,它不再可用。

哪个符合当前标准?在这种情况下,有什么方法可以确保类型名称在 lambda 中仍然可用?

提前致谢!


编辑

该问题似乎已在当前版本中得到修复,因此第一个版本也适用于 MSVS。

最佳答案

MSVC 不符合标准,因为标准说(§9.4.2 [class.static.data]):

The initializer expression in the definition of a static data member is in the scope of its class

很明显,模板参数T在模板类的范围内,因此它的名字应该在静态成员funcObj的初始化器中可用。 Lambda 继承封闭作用域的类型,因此此版本 符合标准:

template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
[]{return new T();};

关于templates - C++11 MSVS vs GCC 静态成员初始化中模板参数名称的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27581077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com