C++ MSVC 2008错误';类型';不是结构(尽管它是)
以下MWE在gcc 4.8.2中编译,但不在MSVC 2008(公司政策)中编译 结构B { }; 结构A { typedef-B处理器; }; 模板 结构Foo { typedef typename T::处理程序类型; }; 模板 结构条 { friend struct Foo::Type;//MSVC 2008不喜欢这样 typedef typename Foo::Type Foo; }; int main() { } MSVC 2008错误C++ MSVC 2008错误';类型';不是结构(尽管它是),c++,templates,visual-c++,language-lawyer,friend,C++,Templates,Visual C++,Language Lawyer,Friend,以下MWE在gcc 4.8.2中编译,但不在MSVC 2008(公司政策)中编译 结构B { }; 结构A { typedef-B处理器; }; 模板 结构Foo { typedef typename T::处理程序类型; }; 模板 结构条 { friend struct Foo::Type;//MSVC 2008不喜欢这样 typedef typename Foo::Type Foo; }; int main() { } MSVC 2008错误 error C2649: 'Foo<T
error C2649: 'Foo<T>::Type' : is not a 'struct'
错误C2649:“Foo::Type”:不是“struct”
这是一个编译器错误还是我在这里做了非法的事情?更重要的是是否有修复方法?删除
struct
关键字,并将其替换为typename
:
template<typename T>
struct Bar
{
friend typename Foo<T>::Type;
typedef typename Foo<T>::Type Foo;
};
模板
结构条
{
朋友类型名Foo::Type;
typedef typename Foo::Type Foo;
};
它似乎无效。[class.friend]/3:
未声明函数的friend
声明应具有一个
以下表格之一:friend
详细的类型说明符
friend
简单类型说明符代码>
friend
typename说明符代码>
但是,对详细的类型说明符有一个重要的限制:[dcl.type.elab]/2:
如果标识符解析为typedef名称[…]则
详细的类型说明符格式不正确
在这方面,GCC和Clang是错误的,令人惊讶的是,VC++是正确的。
您可以使用第一个引号的第三个项目符号并使用typename说明符
friend typename Foo<T>::Type;
friendtypename Foo::Type;
(Un)幸运的是,它在VC++上没有typename
,可能与编译器错误有关:
friend typename Foo<T>::Type;