让我们考虑以下演示程序。
#include <iostream>
struct A
{
struct B
{
int b = 10;
};
int B = 20;
};
template <class T>
struct C
{
void f() const
{
typename /*struct*/ T::B b;
int x = b.b;
std::cout << "x == " << x << '\n';
}
};
int main()
{
C<A>().f();
}
正如所见,struct B
结构中成员的声明被类型A
为 的数据成员的声明所隐藏。B
int
所以在模板结构声明的函数定义中
typename /*struct*/ T::B b;
T::B
不应该找到依赖的名称。
但是编译器gcc 8.3
成功编译程序并且程序输出
x == 10
另一方面,编译器Visual C++ 2019不会编译程序并发出语法错误。
那么它是编译器gcc 8.3的错误吗?
第二个问题是,如果允许这种带有详细类型说明符的构造(带有未注释的关键字结构)是很自然的。
typename struct T::B b;
但是,两个编译器都认为该构造不正确。
确实不正确吗?