C++ 方法实现:我可以避免每次都输入类名吗?

uli*_*ess 0 c++ namespaces code-formatting

当我MyClass在命名空间中有一个 C++ 类时mynamespace,我将它的方法实现为

void mynamespace::MyClass::method() { … }
Run Code Online (Sandbox Code Playgroud)

我可以将其包装在命名空间中以将各个定义缩短为

namespace mynamespace {

    void MyClass::method() { ... }

}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免重新输入MyClass::,以便我可以{在签名更改时更轻松地将 之前的所有内容复制到标题作为原型,而不必MyClass::每次都删除?

我想“一个类也是一个命名空间,也许我可以做到”

namespace mynamespace::MyClass {

    void method() { ... }

}
Run Code Online (Sandbox Code Playgroud)

但这抱怨我将 MyClass 重新定义为不同的东西。using mynamespace::MyClass;也不起作用(但无论如何都会很糟糕,因为如果它起作用,我将如何在该文件中该行下方的任何位置声明一个独立函数)。

是否有解决方案,或者在 C++ 中根本不可能?

asc*_*ler 6

不,限定的类名必须出现在类定义之外定义的任何类成员上。(并且只能有一个类定义,通常在头文件中。)

C++ 标准在[class.mfct]/4 中阐明了这个规则:

如果成员函数的定义在词法上超出其类定义,则成员函数名称应使用?::? 操作员。

同样在[class.static.data]/2 中用于静态数据成员。

您可以使用预处理器宏来缩写此限定,但这会严重损害可读性并且不是一种常见做法。