Referencia no definida a un miembro estático

91

Estoy usando un compilador cruzado. Mi codigo es:

class WindowsTimer{
public:
  WindowsTimer(){
    _frequency.QuadPart = 0ull;
  } 
private:
  static LARGE_INTEGER _frequency;
};

Obtuve el siguiente error:

referencia indefinida a `WindowsTimer :: _ frecuencia '

También intenté cambiarlo a

LARGE_INTEGER _frequency.QuadPart = 0ull;

o

static LARGE_INTEGER _frequency.QuadPart = 0ull;

pero sigo recibiendo errores.

alguien sabe por qué?

kakush
fuente
¿Dónde (si en algún lugar) ha definido WindowsTimer::_frequency ?
CB Bailey
@CharlesBailey Es mi único miembro en la clase.
kakush

Respuestas:

107

Necesita definir _frequencyen el archivo .cpp.

es decir

LARGE_INTEGER WindowsTimer::_frequency;
Ed Heal
fuente
¿Por qué debería hacerlo así?
ahora
35

El vinculador no sabe dónde asignar los datos _frequencyy debe indicarlo manualmente. Puede lograr esto simplemente agregando esta línea: LARGE_INTEGER WindowsTimer::_frequency = 0;en una de sus fuentes de C ++.

Explicación más detallada aquí

Vyktor
fuente
28

Con C ++ 17, puede declarar su variable en línea , ya no es necesario definirla en un archivo cpp.

inline static LARGE_INTEGER _frequency;
Zhenxiao Hao
fuente
Esto me da un errorerror: 'foobar' declared as an 'inline' field
Pedro Henrique
3
NVM, acabo de actualizar mi GCC a través del administrador MinGW de 6.3 a 8.2 y funciona bien.
Pedro Henrique
24

Si hay una variable estática declarada dentro de la clase, debe definirla en el archivo cpp como este

LARGE_INTEGER WindowsTimer::_frequency = 0;
Raghuram
fuente