我一直在尝试使用模板一段时间而且我做的越少,我意识到我理解的越少。这个最新的问题感觉就像我发现了一个相当根本的误解,我开始比以往任何时候都更加思考,“对,明天我不应该编写任何代码,而是找到一个具有良好CS部分的库,而且只是阅读模板上的所有内容“!我想知道你是否可以帮助我。
所以,以下代码,
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>
描述不兼容的类型?
而且,在访问图书馆之前,任何关于该主题的“必要”,在线,阅读材料的链接也会受到欢迎。 感谢。
答案 0 :(得分:2)
在gcc 4.4.3上,您的第二个示例无法编译,并显示消息“错误:没有匹配函数来调用'Foo&lt; 1&gt; :: Foo(Foo&lt; 0&gt; :: Bar&amp;)'”,这正是你期望发生什么。
所以你没有误解任何事情。如果这为您编译,那么编译器就会出现非标准行为。