101*_*010 8 c++ struct c++11 visual-studio-2013 c++14
考虑以下代码:
struct Foo {};
template<typename ForwardIterator>
struct Foo*
Bar(ForwardIterator first, ForwardIterator last)
{
(void)first;
(void)last;
Foo *foo(nullptr);
return foo;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在Clangv3.5和GCCv4.9中编译得很好.
但是,它无法在VC++ 2013中编译.
struct
从返回类型中删除标识符(见下文)可以解决问题:
struct Foo {};
template<typename ForwardIterator>
Foo*
Bar(ForwardIterator first, ForwardIterator last)
{
(void)first;
(void)last;
Foo *foo(nullptr);
return foo;
}
Run Code Online (Sandbox Code Playgroud)
这是一个视觉工作室的错误吗?
这个问题出现了,因为在我的代码库中,它Foo
struct
位于一个.h.c
文件中(即,是一个C struct
),为了struct
在我的代码中表示C/POD ,我使用了struct
标识符.这是一个坏主意(即,在C++代码中我应该避免以struct
这种方式使用标识符)?
精心设计的类型说明符的要点是允许您从草案C++标准部分3.4.4
Elaborated类型说明符中引用已隐藏的名称:
精心设计的类型说明符(7.1.6.3)可用于引用先前声明的类名或枚举名,即使该名称已被非类型声明隐藏(3.3.10).
所以在Foo
隐藏的情况下,你必须使用精心设计的类型说明符:
struct Foo {};
void Foo()
{
}
Run Code Online (Sandbox Code Playgroud)
我在7.1.6.3
Elaborated类型说明符或14
模板中看不到任何会阻止此用法的内容.事实上,从CS2989的描述看起来,Visual Studio变得混乱并认为您正在尝试将非模板类重新定义为模板类.
所以这看起来像是一个bug,所以我会提交错误报告.
更新
提交了一份错误报告.