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à một kiểu số nguyên.Xác định các số nguyên const tĩnh trong định nghĩa lớp
Tại sao, sau đó, mã sau có cho tôi lỗi liên kết không?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
Các lỗi tôi nhận được là:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Điều thú vị là, nếu tôi nhận xét ra các cuộc gọi đến std :: phút, mã biên dịch và liên kết tốt (mặc dù thử nghiệm :: N cũng là được tham chiếu trên dòng trước đó).
Bất kỳ ý tưởng nào về những gì đang diễn ra?
Trình biên dịch của tôi là gcc 4.4 trên Linux.
Hoạt động tốt trên Visual Studio 2010. – Puppy
Lỗi chính xác này được giải thích tại https://gcc.gnu.org/wiki/VerboseDiagnostics#missing_static_const_definition –
Trong trường hợp cụ thể của 'char', bạn có thể xác định nó thay vì' 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. Tôi lo lắng về điều này mặc dù - nó có thể hành xử kỳ lạ trong một tập tin tiêu đề giữa các đơn vị dịch thuật khác nhau, như chuỗi có thể sẽ có nhiều địa chỉ khác nhau. –