c++ - 模板编程 - 常见错误

标签 c++ templates wiki

<分区>

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 的片段而不会出错,即使这是不合法的!

关于c++ - 模板编程 - 常见错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3766151/

相关文章:

wordpress - 如何在 Wordpress 中使用 wiki 标记

asp.net-mvc - asp.net mvc wiki

c++ - 如何在 C++ 中将一个 .exe 链接到另一个 .exe

c++ - 在模板化类中,如何定义具有不同类型名称的函数

c++ - int* 的默认值是 NULL 吗?

iphone - 适合移动用户的最佳 Wiki

C++ - 不需要使用基本方法

c++ - 有没有办法以编程方式遍历头文件?

c++ - 如何避免 C++ 中的 float 舍入问题?

c++ - 找不到基类模板的成员