转发声明的替代方法不适用于名称空间

我知道,作为类的前向声明的替代方法,您可以使用C样式标识符/声明,如下所示:

//instead of
class Foo;

void func(Foo* foo);

//do

void func(class Foo* foo);

但是在这种情况下,只有在更改了编译器(Visual Studio)中的设置后,我才遇到问题。我认为它被设置为宽松的,或者没有强制执行许多一致性标准。

namespace Foo
{
    void func(class Bar* bar) {}
}

class Bar {};

int main()
{
    Bar bar;
    Foo::func(&bar); // argument of type "Bar *" is incompatible with parameter of type "Foo::Bar *"    
// cannot convert argument 1 from 'Bar *' to 'Foo::Bar *'   

}

如果Foo是一门课,那么这很好。有没有办法使用名称空间来做到这一点?