繁体   English   中英

为什么在函数范围内不允许类前向声明​​?

[英]Why class forward declaration is not allowed in function scope?

下面的代码工作正常:

template<typename T> class X {};
class A;  // line-1
void foo();  // line-2
int main ()
{
  X<A> vA;
}
class A {};
void foo() {}

让line-1和line-2在main()中移动。 该函数不会受到影响,但class A前向声明不起作用,并给出编译器错误

error:模板的模板参数template<class T> class X使用本地类型main()::A

您可以观察到的是,因为在C ++中,您可以在函数内定义类。 所以,如果你放置class A; main ,您正在声明此函数范围内的class main::A (即class main::A ),而不是全局范围( class A )。

因此,您最终使用未定义类的模板参数( X<main::A> )声明类型为X的对象。

错误:模板类X的模板参数使用本地类型main():: A.

这是真正的问题 - 使用本地类型。 在C ++ 03中,您不能使用本地类型作为模板参数,因为没有人知道如何命名结果类型。

如果你在几个重载函数中有几个class A (再次使用相同的名称),那么结果X<A>那么是相同的类型,还是不同的类型? 你怎么把他们分开?

在C ++ 03中,标准传递了这个,并且只是说“不要那样做!”。

通过决定使用本地类型A X<A>与在函数之外的匿名命名空间中声明A的情况相同,在C ++ 11中解决了该问题,例如

namespace
{
    class A
    { };
}

int main()
{
    X<A>   vA;
}

因此,使用较新的编译器(或使用-std=cpp11选项),您可以使用本地类,我们也知道它的含义。


但是,在函数内声明一个类型仍然不同于在另一个范围内声明它的前向相同。 它们只是不同的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM