我试图理解为什么以下是一个错误:
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++语法规定如此”,还是有更复杂的原因?
3条答案
按热度按时间lstz6jyr1#
关键字
static
在C++中有几种不同的含义,上面编写的代码以两种不同的方式使用它们。在成员函数的上下文中,
static
意味着“这个成员函数没有接收器对象。它基本上是一个嵌套在类作用域内的普通函数。”在函数声明的上下文中,
static
表示“此函数的作用域仅限于此文件,不能从其他位置调用。”当您通过编写
编译器将这里的
static
解释为“我正在实现这个成员函数,并且我希望使该函数只对这个文件是本地的。”这在C++中是不允许的,因为它会引起一些混乱:如果多个不同的文件都定义了它们自己的成员函数实现,然后声明它们为static
以避免链接时的冲突,那么从不同的位置调用同一个成员函数将导致不同的行为!幸运的是,正如您所指出的,有一个简单的解决方法:只需从定义中删除
static
关键字:这是非常好的,因为编译器已经知道
do_something
是一个static
成员函数,因为你在前面已经告诉过它了。0kjbasz62#
这个问题已经很好地回答了。静态的详细信息可以阅读here
黄金法则:static保留字只能与类别定义内的静态成员宣告一起使用,而不能与该静态成员的定义一起使用。
bfnvny8b3#
为了便于以后参考,要让静态方法将静态方法代码放在同一个文件中调用它的位置,并将其定义为static。还要删除类引用。
所以改为:
用途:
它将不能访问对象值,而只是将这些值作为参数传入。