具有静态链接的成员函数

时间:2015-07-08 23:41:36

标签: c++ static

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

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

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

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

这个错误带有"错误:无法声明成员函数' static void Foobar :: do_something()'有静态联动"用g ++和"错误:'静态'只能在类定义中指定"在clang ++中。

我知道修复此问题的方法是删除"静态"在第6行的do_something的定义中。但是,我不明白为什么这是一个问题。这是一个世俗的原因,例如" C ++语法决定如此"还是更复杂的事情?

2 个答案:

答案 0 :(得分:51)

我认为这里的问题是关键字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成员函数,因为你之前已经告诉过它。

希望这有帮助!

答案 1 :(得分:3)

这个问题已经很好回答。可以查看here

的静态详细信息

黄金法则: static关键字仅与类定义中的静态成员的声明一起使用,而不能与该静态成员的定义一起使用。