Referencia indefinida a un miembro estático [duplicado]

Resuelto kakush asked hace 12 años • 0 respuestas

Estoy usando un compilador cruzado. Mi código es:

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

Obtuve el siguiente error:

referencia no definida a `WindowsTimer::_frequency'

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 avatar Feb 02 '12 17:02 kakush
Aceptado

Debe definirlo _frequencyen el archivo .cpp.

es decir

LARGE_INTEGER WindowsTimer::_frequency;
Ed Heal avatar Feb 02 '2012 10:02 Ed Heal

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

inline static LARGE_INTEGER _frequency;
betteroutthanin avatar Dec 10 '2018 12:12 betteroutthanin

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 avatar Feb 02 '2012 10:02 Vyktor

Si hay una variable estática declarada dentro de la clase, entonces debes definirla en el archivo cpp de esta manera

LARGE_INTEGER WindowsTimer::_frequency = 0;
Raghuram avatar Feb 02 '2012 10:02 Raghuram

Este es un ejemplo de código completo para esta otra pregunta que de hecho es un duplicado de esta.

#include <iostream>

#include <vector>
using namespace std;

class Car
{

public:
    static int b;                   // DECLARATION of a static member


    static char* x1(int x)
    {
        b = x;                      // The static member is used "not as a constant value"
                                    //  (it is said ODR used): definition required
        return (char*)"done";
    }

};

int Car::b;                         // DEFINITION of the static 

int main()
{
    char* ret = Car::x1(42);
    for (int x = 0; x < 4; x++)
    {
        cout << ret[x] << endl;
    }

    return 0;
}
Serge Ballesta avatar Jun 30 '2021 13:06 Serge Ballesta