为什么我不能转发声明静态函数?

Why can I not forward-declare a static function?

我需要在头文件中转发声明一个 class,如下所示:

class MyStaticClass;

我理解为什么不能前向声明此 class 的数据成员。我曾经认为你可以但是前向声明函数。我想声明此 class 的静态函数,如下所示:

class MyStaticClass;
static int MyStaticClass::AddTwoNumbers(const int a, const int b);

虽然这给了我一个编译错误:

error C2027: use of undefined type 'MyStaticClass'

为什么不能这样做?或者毕竟有这样做的秘密方法?

这是不允许的,因为它允许其他人将成员函数添加到 class 而无需编辑 class 本身。

考虑一下,

struct X
{
    static void f(float a) { std::cout << a << std::endl; }
 private:
    static int _data; //inaccessible to non-member
};

X::f(0); //convert 0 (an int) to float, and call X::f().

现在想象有人来 forward-declare 下面的函数,就在包括定义上面 class:

的 header 之前
static void X::f(int);

现在之前的调用 X::f(0) 会给出链接器错误(未解析的名称)因为现在 0 不会转换为 float,因为它不需要,因为有一个 declared 函数接受 int,尽管它没有定义——更糟糕的是,如果它被定义了,那么你甚至不会得到链接器错误,您可能不容易知道正在调用不同的函数。

还有。 f(int) 现在也可以访问 private 成员 _data — 这样,任何人都可以通过随意添加函数来访问任何 private/protected 成员。