ไม่ได้กำหนดการอ้างอิงถึงสมาชิกแบบคงที่


93

ฉันใช้คอมไพเลอร์ข้าม รหัสของฉันคือ:

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 Bailey

@CharlesBailey เป็นสมาชิกคนเดียวของฉันในชั้นเรียน
kakush

คำตอบ:



37

Linker ไม่รู้ว่าจะจัดสรรข้อมูลให้ที่ไหน_frequencyและคุณต้องบอกด้วยตนเอง คุณสามารถทำได้โดยการเพิ่มบรรทัดนี้LARGE_INTEGER WindowsTimer::_frequency = 0;ลงในแหล่งที่มา C ++ ของคุณ

คำอธิบายโดยละเอียดเพิ่มเติมที่นี่


31

ด้วย C ++ 17 คุณสามารถประกาศตัวแปรแบบอินไลน์ได้โดยไม่จำเป็นต้องกำหนดในไฟล์ cpp อีกต่อไป

inline static LARGE_INTEGER _frequency;

สิ่งนี้ทำให้ฉันมีข้อผิดพลาดerror: 'foobar' declared as an 'inline' field
Pedro Henrique

3
NVM ฉันเพิ่งอัปเดต GCC ผ่านตัวจัดการ MinGW จาก 6.3 เป็น 8.2 และใช้งานได้ดี
Pedro Henrique

24

หากมีการประกาศตัวแปรคงที่ภายในคลาสคุณควรกำหนดไว้ในไฟล์ cpp เช่นนี้

LARGE_INTEGER WindowsTimer::_frequency = 0;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.