Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC 2008错误';类型';不是结构(尽管它是)_C++_Templates_Visual C++_Language Lawyer_Friend - Fatal编程技术网

C++ 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

以下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>::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;