繁体   English   中英

具有静态链接的成员函数

[英]Member function with static linkage

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

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

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

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

此错误与“错误:无法将成员函数 'static void Foobar::do_something()' 声明为具有静态链接”在 g++ 中,以及“错误:'static' 只能在类定义中指定”在 clang++ 中。

我知道解决这个问题的方法是删除第 6 行 do_something 定义中的“静态”。但是,我不明白为什么这是一个问题。 这是一个平凡的原因,例如“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_something是一个static成员函数,因为您之前已经告诉过它。

这个问题已经很好回答了。 静态的详细信息可以在这里阅读

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM