`typename`参数化模板和积分类型1之间的差异

时间:2010-07-19 21:45:12

标签: c++ templates

我一直在尝试使用模板一段时间而且我做的越少,我意识到我理解的越少。这个最新的问题感觉就像我发现了一个相当根本的误解,我开始比以往任何时候都更加思考,“对,明天我不应该编写任何代码,而是找到一个具有良好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>描述不兼容的类型?

而且,在访问图书馆之前,任何关于该主题的“必要”,在线,阅读材料的链接也会受到欢迎。 感谢。

1 个答案:

答案 0 :(得分:2)

在gcc 4.4.3上,您的第二个示例无法编译,并显示消息“错误:没有匹配函数来调用'Foo&lt; 1&gt; :: Foo(Foo&lt; 0&gt; :: Bar&amp;)'”,这正是你期望发生什么。

所以你没有误解任何事情。如果这为您编译,那么编译器就会出现非标准行为。