По действительно педантичным правилам, да, ваш код нуждается в определении для этого статического целого числа.
Но по практическим правилам и тому, что реализуют все компиляторы, потому что так предназначены правила C ++ 03 - нет, вам не нужно определение.
Правила для таких целых статических констант предназначены для того, чтобы позволить вам опустить определение, если целое число используется только в тех ситуациях, когда значение сразу читается, и если статический член может использоваться в константных выражениях.
В вашем операторе return значение члена сразу же читается, поэтому вы можете опустить определение целочисленного члена статической константы, если это единственное его использование. Однако следующая ситуация требует определения:
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
Здесь не читается значение - вместо этого берется его адрес. Таким образом, цель стандарта C ++ 03 состоит в том, что вы должны предоставить определение для члена, как показано ниже в некотором файле реализации.
const int A::B::b;
Обратите внимание, что действительные правила , представленные в Стандарте C ++ 03, говорят, что определение не требуется только в том случае, если переменная используется, когда константное выражение требуется . Однако это правило, если оно строго соблюдается, является слишком строгим. Это позволит вам только опустить определение для ситуации, подобной измерениям массива, но потребует определения в случаях, таких как оператор возврата. Соответствующее сообщение о дефекте здесь .
Формулировка C ++ 0x была обновлена, чтобы включить разрешение этого дефекта и разрешить ваш код в том виде, как он написан.