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

时间:2015-04-07 10:03:41

标签: c++ static forward-declaration

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

class MyStaticClass;

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

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

这给了我一个编译错误:

error C2027: use of undefined type 'MyStaticClass'

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

1 个答案:

答案 0 :(得分:3)

这是不允许的,因为它允许其他人将成员函数添加到类中,甚至不编辑类本身。

考虑一下,

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().

现在想象有人前来 - 前面 - 声明以下函数,就在包含定义上述类的标题之前:

static void X::f(int);

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

Morever。 f(int)现在也可以访问private成员_data - 通过这种方式,任何人都可以通过随意添加功能来访问任何私人/受保护成员。