Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Member function with static linkage

Tags:

c++

static

I'm trying to understand why the following is an error:

class Foobar {  public:   static void do_something(); };  static void Foobar::do_something() {} // Error!  int main() {   Foobar::do_something(); } 

This errors with "error: cannot declare member function 'static void Foobar::do_something()' to have static linkage" in g++, and "error: 'static' can only be specified inside the class definition" in clang++.

I understand that the way to fix this is to remove "static" in the definition of do_something on line 6. I don't, however, understand why this is an issue. Is it a mundane reason, such as "the C++ grammar dictates so", or is something more complicated going on?

like image 817
Achal Dave Avatar asked Jul 08 '15 23:07

Achal Dave


People also ask

Can a member function be static?

Static Function Members A static member function can only access static data member, other static member functions and any other functions from outside the class. Static member functions have a class scope and they do not have access to the this pointer of the class.

Can a static function call a member function?

A static member function can access only the names of static members, enumerators, and nested types of the class in which it is declared. Suppose a static member function f() is a member of class X . The static member function f() cannot access the nonstatic members X or the nonstatic members of a base class of X .

How is a static member function called?

A static function can only access other static variables or functions present in the same class. Static member functions are called using the class name. Syntax- class_name::function_name( )

How static data member and member function are used?

The static member functions are special functions used to access the static data members or other static member functions. A member function is defined using the static keyword. A static member function shares the single copy of the member function to any number of the class' objects.


2 Answers

The keyword static has several different meanings in C++, and the code you've written above uses them in two different ways.

In the context of member functions, static means "this member function does not have a receiver object. It's basically a normal function that's nested inside of the scope of the class."

In the context of function declarations, static means "this function is scoped only to this file and can't be called from other places."

When you implemented the function by writing

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

the compiler interpreted the static here to mean "I'm implementing this member function, and I want to make that function local just to this file." That's not allowed in C++ because it causes some confusion: if multiple different files all defined their own implementation of a member function and then declared them static to avoid collisions at linking, calling the same member function from different places would result in different behavior!

Fortunately, as you noted, there's an easy fix: just delete the static keyword from the definition:

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

This is perfectly fine because the compiler already knows that do_something is a static member function, since you told it about that earlier on.

like image 122
templatetypedef Avatar answered Oct 19 '22 06:10

templatetypedef


This question is already well answered. Details for static can be read here

Golden Rule: The static keyword is only used with the declaration of a static member, inside the class definition, but not with the definition of that static member.

like image 39
user2235747 Avatar answered Oct 19 '22 06:10

user2235747