Я понимаю, что C ++ позволяет определять статические константные члены внутри класса, если это целочисленный тип.
Почему же тогда следующий код выдает ошибку компоновщика?
#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
, где, насколько мне известно, все еще есть хранилище, определенное компоновщиком. В этом случае можно также использовать встроенное ключевое слово для определения статической переменной внутри теста определения класса.