Правильно ли указан код в "С++ Programming Language Third Edition" на стр. 854?

Я пытаюсь изучить С++. В книге "Третий выпуск на языке программирования С++" я нашел код на стр. 854 (Приложение C.13.1):

template<class T> class X {
    static T def_val;
    static T* new_X(T a = def_val);
};

template<class T> T X<T>::def_val(0, 0);
template<class T> T* X<T>::new_X(T a) { /* ... */ }

template<> int X<int>::def_val<int> = 0;
template<> int* X<int>::new_X<int>(int i) { /* ... */ }

Я изменяю его:

template<class T> class X {
    static T def_val;
    static T* new_X(T a = def_val);
};

template<class T> T X<T>::def_val(0, 0);
template<class T> T* X<T>::new_X(T a) { return new T(a); }

template<> int X<int>::def_val<int> = 0;
template<> int* X<int>::new_X<int>(int i) { return new int(i); }

Но мой компилятор не скомпилирует его:

1>main.cpp(15): error C2143: syntax error : missing ';' before '<'
1>main.cpp(15): error C2988: unrecognizable template declaration/definition
1>main.cpp(15): error C2059: syntax error : '<'
1>main.cpp(16): error C2143: syntax error : missing ';' before '<'
1>main.cpp(16): error C2470: 'X<T>::new_X' : looks like a function definition, but there is no parameter list; skipping apparent body
1>          with
1>          [
1>              T=int
1>          ]
1>main.cpp(16): error C2988: unrecognizable template declaration/definition
1>main.cpp(16): error C2059: syntax error : '<'
1>main.cpp(19): error C2143: syntax error : missing ';' before '{'
1>main.cpp(19): error C2447: '{' : missing function header (old-style formal list?)
1>
1>Build FAILED.

Какой неправильный код в книге или компиляторе?

Ответы

Ответ 1

Не забудьте по электронной почте Stroustrup. На главной странице :

"В качестве небольшого знака моей благодарности люди, которые сообщают о проблемах и тем самым помогите мне улучшить книгу, я предлагаю вознаграждение тому, кто впервые орфографическая ошибка, ошибка в примере кода, или фактическая ошибка в тексте для меня. Баунти за новые ошибки в тексте составляет 32 доллара США."

Изменить: Ой. Вы опоздали. Ошибка была исправлена ​​в 19-й печати. См. здесь. Так что никакой щедрости, извините!

Исправленная версия выглядит следующим образом:

template class X {
    // ...
    static T def_val;
    static T* new_X(T a = def_val);
};

template< class T> T X<T>::def_val; // initialize to X<T>()
template< class T> T* X<T>::new_X(T a) { /* ... */ }

template< > int X<int>::def_val = 0;
template< > int* X<int>::new_X(int i) { /* ... */ }

Ответ 2

Код из книги неверен. Последние две строки должны читать:

template<> int X<int>::def_val = 0;
template<> int* X<int>::new_X(int i) { return new int(i); }

Ответ 3

Вы хотите

template<class T> class X {
    static T def_val;
    static T* new_X(T a = def_val);
};

template<class T> T X<T>::def_val(0, 0);
template<class T> T* X<T>::new_X(T a) { return new T(a); }

template<> int X<int>::def_val = 0;
template<> int* X<int>::new_X(int i) { return new int(i); }