정적 멤버에 대한 정의되지 않은 참조


91

크로스 컴파일러를 사용하고 있습니다. 내 코드는 다음과 같습니다.

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

다음과 같은 오류가 발생합니다.

`WindowsTimer :: _ frequency '에 대한 정의되지 않은 참조

나는 또한 그것을 바꾸려고 노력했다

LARGE_INTEGER _frequency.QuadPart = 0ull;

또는

static LARGE_INTEGER _frequency.QuadPart = 0ull;

하지만 여전히 오류가 발생합니다.

이유를 아는 사람 있나요?



어디에서 정의 WindowsTimer::_frequency 했습니까?
CB 베일리

@CharlesBailey 수업에서 유일한 멤버입니다.
kakush

답변:


107

_frequency.cpp 파일에서 정의해야 합니다.

LARGE_INTEGER WindowsTimer::_frequency;

왜 그렇게해야합니까?
nowox

35

링커는 데이터를 어디에 할당할지 모르기 _frequency때문에 수동으로 알려야합니다. 다음 줄을 LARGE_INTEGER WindowsTimer::_frequency = 0;C ++ 소스 중 하나에 추가하면 됩니다.

여기에 더 자세한 설명


28

C ++ 17을 사용하면 변수를 inline으로 선언 할 수 있으며 더 이상 cpp 파일에서 정의 할 필요가 없습니다.

inline static LARGE_INTEGER _frequency;

이것은 나에게 오류를 준다error: 'foobar' declared as an 'inline' field
Pedro Henrique 19

3
NVM, MinGW 관리자를 통해 GCC를 6.3에서 8.2로 업데이트했으며 제대로 작동합니다.
Pedro Henrique

24

클래스 내부에 선언 된 정적 변수가 있으면 다음과 같이 cpp 파일에 정의해야합니다.

LARGE_INTEGER WindowsTimer::_frequency = 0;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.