一段时间以来,我一直在尝试使用模板,但我做的越多,我意识到我理解的就越少。这个最新的问题感觉就像是我发现了一个相当根本的误解,我开始比以往任何时候都想得更多,“好吧,明天我不应该写任何代码,而是找一个有很好的 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
类型因此,这个将编译。
所以,我想知道,首先,描述类型名/类参数化模板和整数类型参数化模板之间这种差异的正确术语是什么,这在行为上还有哪些其他差异,以及我可以使用什么方法解决此问题并获得此简单示例所需的行为,以便 Foo<0>
和 Foo<1>
将描述不兼容的类型?
而且,在去图书馆之前,也欢迎任何指向“基本”在线阅读 Material 的链接。 谢谢。
最佳答案
在 gcc 4.4.3 上,您的第二个示例无法编译并显示消息“错误:没有匹配函数调用 'Foo<1>::Foo(Foo<0>::Bar&)'”,这正是你期望发生。
所以你没有误会什么。如果这为您编译,那是您的编译器的非标准行为。
关于c++ - `typename` 参数化模板和整数类型模板之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3285351/