0

I have the following code:

class gptr_timer {

private:

  static qtimer_t gptr_get_timer;

public:

  static void create_gptr_get_timer(){
    gptr_get_timer = qtimer_create();
  }

  static void destroy_gptr_get_timer(){
    qtimer_destroy(gptr_get_timer);
  }

  static void start_gptr_get_timer(){
    qtimer_start(gptr_get_timer);
  }

  static void stop_gptr_get_timer(){
    qtimer_stop(gptr_get_timer);
  }

  static double get_gptr_get_time(){
    return qtimer_secs(gptr_get_timer);
  }

};

Which produces the following compile error:

/home/knusbau2/barnes/qppl/gptr.h:24: undefined reference to `ppl::gptr_timer::gptr_get_timer'

I'm a little confused, as I clearly have gptr_get_timer defined.

Kurtis Nusbaum
  • 30,445
  • 13
  • 78
  • 102
  • 2
    Duplicate of (the first half of) http://stackoverflow.com/questions/272900/c-undefined-reference-to-static-class-member - you've only declared the member, not defined it – Philip Kendall Mar 11 '13 at 19:52

1 Answers1

6

By adding a definition:

class gptr_timer { /* ... */ };       // class definition;
                                      // *delcares* static member variables

qtimer_t gptr_timer::gptr_get_timer;  // *define* static member variables

The static member definition has to go into one single translation unit, while the class definition is usually in a header. Beware.

The member definition is also the place for initialization, except in a few special cases (namely static constant expressions) which can be initialized inside the class definition.

Kerrek SB
  • 464,522
  • 92
  • 875
  • 1,084