2010-12-12 3 views
0

Я читаю книгу мышления в C++ (2-е издание Том 1) и у меня есть проблема, когда я пытаюсь скомпилировать этот исходный код:Думая ошибки C++ в исходном коде

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter16_015.html

появляется проблема в этой строке:

Stack :: Ссылка * p;

Как я читал в C++: error "... is not derived from type ..." Я должен добавить перед ним слово «typename» (или «class»).

Является ли книга неправильной в этом примере или я что-то упускаю?

ответ

3

Да, это неправильно. Вам нужен typename. См. Раздел FAQ typename and template.

Stack - зависимый тип, а Stack::List также является зависимым. Это legal в C++ 0x, но это незаконно в текущем C++.

+0

и что в C++ 98, версия, которая была актуальна, когда книга была выпущена? –

+0

@Ben Это было необходимо и там. Единственное изменение, которое я помню, появилось в C++ 03, которое здесь очень важно, так это то, что * unqualified * name 'List' был сделан зависимым типом. Но это, конечно, другое дело. –

0

Является ли книга неправильной в этом примере или я что-то упускаю?

Я обнаружил, что разные компиляторы имеют разные требования к ключевому слову typename. MSVC довольно прощает, gpp является более строгим.

0

Это скорее случай, когда вы используете слишком старую книгу. Дата публикации этой книги - 2000 год, что означает, что значительная часть фактической записи происходила, когда был завершен стандарт C++ 98.

Текущая версия C++ - C++ 03, а C++ 0x быстро приближается к стандартизации.

Я не думаю, что в C++ 98 требуется typename.

0

Это может быть слишком поздно в день, но код должен составить, если изменить

Stack :: Ссылка * р;

только

Ссылка * p;

Смежные вопросы