Possible Duplicate:
C++ template gotchas
你好,
我刚刚进入 SO 的第二个月,我已经看到足够多的关于 SO 的帖子与模板的几个常见问题相关。制作一个关于此的小型 Wiki 是个好主意吗(遗憾的是我不知道如何制作)?
我们的想法是提供像 this 这样权威的引用(GMan 的最爱)
这是我的第一个
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12
如果已经存在一个或者如果这个想法没有吸引力,请随时投票关闭它。我也会投票给它:)
typename 的快速总结
typename
关键字在 C++ 中有两种含义。 typename
可以替代模板参数列表中的 class
。
// These two lines mean exactly the same thing.
template<typename A> class Foo {};
template<class A> class Foo {};
另一个原因比较复杂。 typename
告诉编译器依赖名称实际上是一种类型。
考虑:
template<typename T>
struct Bar
{
typedef T MyType; // Okay.
typedef T::Type OtherType; // Wrong.
};
这是错误的,因为编译器认为 T::Type
实际上不是类型,所以 typedef
失败了。 T
可能将 Type
定义为不是类型的东西(如静态成员),因此编译器必须默认将 T::Type
视为一个非类型,因为它在实例化之前不知道 T
是什么。在这种情况下,T::Type
是标准语言所称的依赖名称。请注意,T
是一个非依赖名称,因为编译器知道 T
实际上是一种类型(它是模板类型参数之一) ,因此不需要 typename
。
在这种情况下,你必须给编译器一个提示:
template<typename T>
struct Bar
{
typedef T MyType; // Okay.
typedef typename T::Type OtherType; // Okay.
};
不幸的是,由于编译器错误,编译器可能会编译没有 typename
的片段而不会出错,即使这是不合法的!