2010-07-19 108 views
1

我一直在尝试使用模板一段时间,我越做越少,我意识到我理解。这个最新的问题让我觉得它已经发现了一个相当根本的误解,我开始比以往更多地思考,“对,明天我不应该写任何代码,而是找一个CS部分很好的库,阅读模板上的所有内容“!我想知道在同一时间你能帮助我。'typename`参数化模板和积分类型之间的差异

所以,下面的代码,

template <typename T> // or replace `typename` with `class` 
struct Foo { 
    struct Bar {}; 
    Foo(Bar) {} 
}; 

Foo<float>::Bar x; 
Foo<int> y (x); 

不能编译,因为xFoo<float>::Bar类型,但构建y我们需要一个Foo<int>::Bar。这很好,和预期,但现在考虑下面,

template <int I> 
struct Foo { 
    struct Bar {}; 
    Foo(Bar) {} 
}; 

Foo<0>::Bar x; 
Foo<1> y (x); 

我希望/思(虽然,谢天谢地,还未依靠),其xFoo<0>::Bar型和构建y我们需要一个Foo<1>::Bar,因此它不会编译 - 如前例所示。但似乎两者其实都是Foo<int>::Bar这样的类型,所以会编译成

所以,我想知道,首先是描述typename/class参数化模板和参数化整型参数化模板之间这种区别的正确术语,还有其他什么不同之处呢?用来解决这个问题,并获得这个简单的例子所需的行为,以便Foo<0>Foo<1>将描述不兼容的类型?

而且,在图书馆之旅之前,任何有关“必要”,在线阅读材料的链接都将受到欢迎。 谢谢。

+2

你的后一个例子不能在GCC上编译。你正在使用哪种编译器? – Yuji 2010-07-19 21:50:00

+2

你给出的代码当然不应该编译,因为你给出的原因是:'Foo <0>'和'Foo <1>'是不同的类型。你正在使用哪种编译器? – 2010-07-19 21:50:56

+0

并将此列表带到您的图书馆:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – 2010-07-19 21:53:09

回答

2

在GCC 4.4.3您的第二个例子失败消息来编译“错误:调用没有匹配的函数‘富< 1> ::美孚(美孚< 0> ::酒吧&)’”,这是正是你期望发生的事情。

所以你没有误解任何东西。如果这为你编译,这是你的编译器的非标准行为。