我正在读“Thinking in C ++”(第2版第1卷),当我尝试编译这个源代码时遇到了问题:
http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter16_015.html
问题似乎出在那一行:
Stack :: Link * p;
正如我在C++: error "... is not derived from type ..."中读到的那样 我必须在它前面加上“typename”(或“class”)这个词。
这个例子中的书是错的还是我错过了什么?
答案 0 :(得分:3)
是的,这是错的。你需要typename
。请参阅typename and template常见问题解答条目。
Stack
是依赖类型,Stack::List
也是依赖类型。这是C ++ 0x中的 legal ,但它在当前的C ++中是非法的。
答案 1 :(得分:0)
这个例子中的书是错的还是我错过了什么?
我发现不同的编译器对typename
关键字有不同的要求。 MSVC相当宽容,gpp更严格。
答案 2 :(得分:0)
你使用的书太旧了。该书的出版日期是2000年,这意味着当C ++ 98标准最终确定时,大部分实际写作都在进行。
当前版本的C ++是C ++ 03,而C ++ 0x正在快速接近标准化。
我认为C ++ 98中不需要typename
。
答案 3 :(得分:0)
这可能为时已晚,但如果您更改
,代码应该编译Stack :: Link * p;
到
Link * p;