Я розумію, що 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, код компілюється і посилається просто чудово (навіть якщо тест :: N також посилається на попередній рядок).
Будь-яка ідея, що відбувається?
Мій компілятор - gcc 4.4 в Linux.
char
ви можете визначити його замість як constexpr static const char &N = "n"[0];
. Зверніть увагу на &
. Я думаю, це працює, тому що буквальні рядки визначаються автоматично. Я хоч і хвилююся з цього приводу - це може поводитися дивно у файлі заголовка серед різних одиниць перекладу, оскільки рядок, ймовірно, буде за кількома різними адресами.
inline const int N = 10
, який, наскільки мені відомо, все ще має місце десь визначене лінкером. Введене ключове слово також може бути використане в цьому випадку для надання визначення статичної змінної всередині тесту на визначення класу.