2013-03-11 120 views
0

我有以下代碼:未定義的靜態類變量

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); 
    } 

}; 

將會產生以下編譯錯誤:

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

我有點困惑,因爲我很清楚有gptr_get_timer定義。

+2

重複(前半部分)http://stackoverflow.com/questions/272900/c-undefined-reference-to-static-class-member - 你只宣佈成員,沒有定義它 – 2013-03-11 19:52:35

回答

6

通過添加一個定義:

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

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

靜態成員定義必須進入一個單一翻譯單元,而類定義通常是一個標頭。謹防。

成員定義也是初始化的地方,除了在類定義中可以初始化的一些特殊情況(即靜態常量表達式)之外。