Насколько я понимаю, C ++ позволяет определять статические члены const внутри класса, если это целочисленный тип.
Вы вроде как правы. Вам разрешено инициализировать статические интегралы const в объявлении класса, но это не определение.
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr038.htm
Интересно, что если я закомментирую вызов std :: min, код скомпилируется и ссылки просто отлично (хотя на test :: N также есть ссылки на предыдущую строку).
Есть идеи о том, что происходит?
std :: min принимает свои параметры по константной ссылке. Если бы он брал их по значению, у вас не было бы этой проблемы, но, поскольку вам нужна ссылка, вам также нужно определение.
Вот глава / стих:
9.4.2 / 4 - Если элемент данных static
имеет const
целочисленный или const
тип перечисления, его объявление в определении класса может указывать constant-initializer , которое должно быть интегральным постоянным выражением (5.19). В этом случае член может появляться в виде целочисленных константных выражений. Член по-прежнему должен быть определен в области имен, если он используется в программе, и определение области имен не должно содержать инициализатор .
См. Ответ Чу о возможном обходном пути.