我只想问为什么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]):
静态数据成员的定义中的初始化程序表达式在其类的范围内
显然,template参数T
在template类的范围内,因此其名称应在static成员的初始化程序中可用funcObj
。Lambda表达式继承类型的封闭范围内的,所以这个版本是符合标准:
template <typename T> typename MyClass<T>::FunctionType MyClass<T>::funcObj =
[]{return new T();};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句