Referencia indefinida a un miembro estático [duplicado]
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é?
Debe definirlo _frequency
en el archivo .cpp.
es decir
LARGE_INTEGER WindowsTimer::_frequency;
Con C++ 17, puede declarar su variable en línea , ya no es necesario definirla en un archivo cpp.
inline static LARGE_INTEGER _frequency;
El vinculador no sabe dónde asignar los datos _frequency
y 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í
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;
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;
}