我一直在尝试使用模板一段时间,我越做越少,我意识到我理解。这个最新的问题让我觉得它已经发现了一个相当根本的误解,我开始比以往更多地思考,“对,明天我不应该写任何代码,而是找一个CS部分很好的库,阅读模板上的所有内容“!我想知道在同一时间你能帮助我。'typename`参数化模板和积分类型之间的差异
所以,下面的代码,
template <typename T> // or replace `typename` with `class`
struct Foo {
struct Bar {};
Foo(Bar) {}
};
Foo<float>::Bar x;
Foo<int> y (x);
不能编译,因为x
是Foo<float>::Bar
类型,但构建y
我们需要一个Foo<int>::Bar
。这很好,和预期,但现在考虑下面,
template <int I>
struct Foo {
struct Bar {};
Foo(Bar) {}
};
Foo<0>::Bar x;
Foo<1> y (x);
我希望/思(虽然,谢天谢地,还未依靠),其x
将Foo<0>::Bar
型和构建y
我们需要一个Foo<1>::Bar
,因此它不会编译 - 如前例所示。但似乎两者其实都是Foo<int>::Bar
这样的类型,所以会编译成。
所以,我想知道,首先是描述typename/class参数化模板和参数化整型参数化模板之间这种区别的正确术语,还有其他什么不同之处呢?用来解决这个问题,并获得这个简单的例子所需的行为,以便Foo<0>
和Foo<1>
将描述不兼容的类型?
而且,在图书馆之旅之前,任何有关“必要”,在线阅读材料的链接都将受到欢迎。 谢谢。
你的后一个例子不能在GCC上编译。你正在使用哪种编译器? – Yuji 2010-07-19 21:50:00
你给出的代码当然不应该编译,因为你给出的原因是:'Foo <0>'和'Foo <1>'是不同的类型。你正在使用哪种编译器? – 2010-07-19 21:50:56
并将此列表带到您的图书馆:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2010-07-19 21:53:09