Tham chiếu không xác định đến một thành viên tĩnh


91

Tôi đang sử dụng một trình biên dịch chéo. Mã của tôi là:

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

Tôi nhận được lỗi sau đây:

tham chiếu không xác định đến `WindowsTimer :: _ frequency '

Tôi cũng đã cố gắng thay đổi nó thành

LARGE_INTEGER _frequency.QuadPart = 0ull;

hoặc là

static LARGE_INTEGER _frequency.QuadPart = 0ull;

nhưng tôi vẫn nhận được lỗi.

có ai biết tại sao không



Bạn đã xác định ở đâu (nếu ở bất cứ đâu) WindowsTimer::_frequency?
CB Bailey

@CharlesBailey Nó là thành viên duy nhất của tôi trong lớp.
kakush

Câu trả lời:


107

Bạn cần xác định _frequencytrong tệp .cpp.

I E

LARGE_INTEGER WindowsTimer::_frequency;

Tại sao tôi phải làm như vậy?
nowox

35

Trình liên kết không biết phân bổ dữ liệu ở đâu _frequencyvà bạn phải thông báo nó theo cách thủ công. Bạn có thể đạt được điều này bằng cách thêm dòng này: LARGE_INTEGER WindowsTimer::_frequency = 0;vào một trong các nguồn C ++ của bạn.

Giải thích chi tiết hơn tại đây


29

Với C ++ 17, bạn có thể khai báo nội tuyến biến của mình , không cần phải định nghĩa biến trong tệp cpp nữa.

inline static LARGE_INTEGER _frequency;

Điều này sẽ cho tôi một lỗierror: 'foobar' declared as an 'inline' field
Pedro Henrique

3
NVM, tôi vừa cập nhật GCC của mình thông qua trình quản lý MinGW từ 6.3 lên 8.2 và nó hoạt động tốt.
Pedro Henrique

24

Nếu có một biến tĩnh được khai báo bên trong lớp thì bạn nên xác định nó trong tệp cpp như thế này

LARGE_INTEGER WindowsTimer::_frequency = 0;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.