c++ 具有静态链接的成员函数

i2loujxw  于 2022-12-05  发布在  其他
关注(0)|答案(3)|浏览(172)

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

class Foobar {
 public:
  static void do_something();
};

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

int main() {
  Foobar::do_something();
}

此错误带有“错误:在g中,无法将成员函数“static void Foobar::do_something()”声明为具有静态链接”,“错误:只能在clang的类定义”“内指定”static“。
我知道解决这个问题的方法是删除第6行do_something定义中的“static”。但是,我不明白为什么这会是一个问题。这是一个普通的原因,比如“C++语法规定如此”,还是有更复杂的原因?

lstz6jyr

lstz6jyr1#

关键字static在C++中有几种不同的含义,上面编写的代码以两种不同的方式使用它们。
在成员函数的上下文中,static意味着“这个成员函数没有接收器对象。它基本上是一个嵌套在类作用域内的普通函数。”
在函数声明的上下文中,static表示“此函数的作用域仅限于此文件,不能从其他位置调用。”
当您通过编写

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

编译器将这里的static解释为“我正在实现这个成员函数,并且我希望使该函数只对这个文件是本地的。”这在C++中是不允许的,因为它会引起一些混乱:如果多个不同的文件都定义了它们自己的成员函数实现,然后声明它们为static以避免链接时的冲突,那么从不同的位置调用同一个成员函数将导致不同的行为!
幸运的是,正如您所指出的,有一个简单的解决方法:只需从定义中删除static关键字:

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

这是非常好的,因为编译器已经知道do_something是一个static成员函数,因为你在前面已经告诉过它了。

0kjbasz6

0kjbasz62#

这个问题已经很好地回答了。静态的详细信息可以阅读here
黄金法则:static保留字只能与类别定义内的静态成员宣告一起使用,而不能与该静态成员的定义一起使用。

bfnvny8b

bfnvny8b3#

为了便于以后参考,要让静态方法将静态方法代码放在同一个文件中调用它的位置,并将其定义为static。还要删除类引用。
所以改为:

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

用途:

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

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

相关问题