ความเข้าใจของฉันคือ C ++ อนุญาตให้กำหนดสมาชิก const แบบคงที่ภายในคลาสได้ตราบใดที่เป็นประเภทจำนวนเต็ม
เหตุใดรหัสต่อไปนี้จึงทำให้ฉันมีข้อผิดพลาดตัวเชื่อมโยง?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
ข้อผิดพลาดที่ฉันได้รับคือ:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
ที่น่าสนใจคือถ้าฉันแสดงความคิดเห็นเกี่ยวกับการเรียกไปที่ std :: min โค้ดจะคอมไพล์และลิงก์ได้ดี (แม้ว่า test :: N จะอ้างอิงในบรรทัดก่อนหน้าด้วย)
มีความคิดว่าเกิดอะไรขึ้น?
คอมไพเลอร์ของฉันคือ gcc 4.4 บน Linux
char
constexpr static const char &N = "n"[0];
หมายเหตุ&
. ฉันเดาว่ามันใช้งานได้เพราะสตริงตามตัวอักษรถูกกำหนดโดยอัตโนมัติ ฉันค่อนข้างกังวลเกี่ยวกับเรื่องนี้ - มันอาจทำงานผิดปกติในไฟล์ส่วนหัวระหว่างหน่วยการแปลที่แตกต่างกันเนื่องจากสตริงอาจอยู่ในที่อยู่ที่แตกต่างกันหลายรายการ
inline const int N = 10
ซึ่งสำหรับความรู้ของฉันยังมีที่เก็บข้อมูลที่กำหนดโดยตัวเชื่อมโยง นอกจากนี้ยังสามารถใช้คีย์เวิร์ดอินไลน์ในกรณีนี้เพื่อให้นิยามตัวแปรคงที่ภายในการทดสอบนิยามคลาส