Sự hiểu biết của tôi là C ++ cho phép các thành viên const tĩnh được định nghĩa bên trong một lớp miễn là nó là kiểu số nguyên.
Vậy tại sao đoạn mã sau đây lại cho tôi lỗi trình liên kết?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
Lỗi tôi nhận được là:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Thật thú vị, nếu tôi nhận xét lệnh gọi tới std :: min, mã biên dịch và liên kết tốt (mặc dù test :: N cũng được tham chiếu ở dòng trước).
Bất kỳ ý tưởng về những gì đang xảy ra?
Trình biên dịch của tôi là gcc 4.4 trên Linux.
char
, bạn có thể định nghĩa nó thay thế bằng constexpr static const char &N = "n"[0];
. Lưu ý &
. Tôi đoán điều này hoạt động vì các chuỗi ký tự được xác định tự động. Tuy nhiên, tôi hơi lo lắng về điều này - nó có thể hoạt động kỳ lạ trong tệp tiêu đề giữa các đơn vị dịch khác nhau, vì chuỗi có thể sẽ ở nhiều địa chỉ khác nhau.
inline const int N = 10
, theo hiểu biết của tôi vẫn có một bộ lưu trữ ở đâu đó được xác định bởi trình liên kết. Nội tuyến từ khóa cũng có thể được sử dụng trong trường hợp này để cung cấp định nghĩa biến tĩnh bên trong kiểm tra định nghĩa lớp.