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

标签 c++ static

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

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 定义中的“静态”。但是,我不明白为什么这是一个问题。这是一个普通的原因,例如“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 成员函数,因为您之前已经告诉过它。

关于c++ - 具有静态链接的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31305717/

相关文章:

c++ - vector 不能由 {} 初始化

c++ - MinGW 库中的 Windows api 函数 InitCommonControlsEx() 在哪里

c++ - 未解析的外部符号,带有自制委托(delegate)

c++ - 为什么 March=native 会破坏我的程序?

c++ - 为什么我不能在类中为静态变量设置值?

c# - 使用具有属性的静态方法

c++ - 如何确保我的节点被添加到链表中

java - 为什么存在私有(private)静态方法,这些方法不在任何静态上下文中被调用?

java - 使用父类(super class)类型过滤模板可以删除对父类(super class)中静态变量的修改

c++ - 如何使用矮人确定非成员函数中的局部静态变量