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é?



¿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;

¿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í


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;

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.