具有静态链接的成员函数



我试图理解为什么下面是一个错误:

class Foobar {
 public:
  static void do_something();
};
static void Foobar::do_something() {} // Error!
int main() {
  Foobar::do_something();
}

在g++中出现"error: cannot declare member function 'static void Foobar::do_something()' to have static linkage"和clang++中出现"error: 'static'只能在类定义中指定"的错误。

我理解解决这个问题的方法是删除第6行do_something定义中的"static"。然而,我不明白为什么这是一个问题。这是一个普通的原因,比如"c++语法规定如此",还是有更复杂的事情发生?

关键字static在c++中有几种不同的含义,您上面编写的代码以两种不同的方式使用它们。

在成员函数上下文中,static表示该成员函数没有接收对象。它基本上是一个嵌套在类作用域内的普通函数。"

在函数声明的上下文中,static表示"此函数仅适用于此文件,不能从其他地方调用"。

当你通过写

实现函数时
static void Foobar::do_something() {} // Error!

编译器将这里的static解释为"我正在实现这个成员函数,并且我想使该函数仅在此文件中本地"。这在c++中是不允许的,因为它会引起一些混乱:如果多个不同的文件都定义了自己的成员函数实现,然后声明它们为static以避免链接时的冲突,那么从不同的地方调用相同的成员函数将导致不同的行为!

幸运的是,正如您所注意到的,有一个简单的修复方法:只需从定义中删除static关键字:

void Foobar::do_something() {} // Should be good to go!

这是非常好的,因为编译器已经知道do_somethingstatic成员函数,因为您在前面告诉过它。

这个问题已经有了很好的答案。static的详细信息可以在这里阅读

黄金法则:static关键字仅用于类定义内部的静态成员声明,而不能用于该静态成员的定义。

为了将来的参考,让静态方法将静态方法代码放在同一个文件中调用它的地方,并将其定义为静态。还要删除类引用。

所以不是:

static void Foobar::do_something() {} // Error!

使用:

static void doSomething(){} // the Foobar is removed

它将不能访问对象的值,而只是将这些作为参数传入。

最新更新