C++ 静态连杆杆函数

C++ 静态连杆杆函数,c++,static,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++中为“错误:'stat

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

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行dou_something定义中的“static”。然而,我不明白为什么这是一个问题。这是一个平凡的原因,比如“C++语法规定了什么”,或者是更复杂的事情?

< P> C++中的关键字<代码>静态< /代码>有几个不同的含义,上面写的代码用两种不同的方式使用。 在成员函数的上下文中,
static
表示“此成员函数没有接收方对象。它基本上是嵌套在类范围内的普通函数。”

在函数声明的上下文中,
static
表示“此函数仅限于此文件,不能从其他位置调用。”

当您通过编写

static void Foobar::do_something() {} // Error!
编译器将这里的
static
解释为“我正在实现这个成员函数,并且我想使这个函数仅位于这个文件的本地。”在C++中,这是不允许的,因为它会造成一些混淆:如果多个不同的文件都定义了自己的成员函数的实现,然后声明它们“代码< static < /Cord>”,以避免在链接时发生冲突,从不同的位置调用相同的成员函数会导致不同的行为。p> 幸运的是,正如您所指出的,有一个简单的解决方法:只需从定义中删除
static
关键字:

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

这是非常好的,因为编译器已经知道,
do\u something
是一个
静态成员函数,因为您之前已经告诉过它。

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

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

这很有意义,谢谢!我认为编译器可以区分静态void some_function(){…}和静态void Foobar::some_method(){…}并对它们进行不同的处理,但这会使人类更难解析,因为这两种方法具有不同的语义和非常相似的语法。我不太满意这个解决方案,因为它很难看到一个方法是静态的,通过查看它的实现(没有注释),但是哦,好的。当你在Se>代码>它基本上是一个正常的函数,嵌套在类< /Cube >的范围内,你是否指全局?这是C++中容易犯的错误,许多教程()甚至没有涉及到这种微妙的不同之处