思考源代码中的C ++错误

时间:2010-12-12 00:15:37

标签: c++ templates

我正在读“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”)这个词。

这个例子中的书是错的还是我错过了什么?

4 个答案:

答案 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;