c++ - `typename` 参数化模板和整数类型模板之间的差异

标签 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 类型因此,这个编译。

所以,我想知道,首先,描述类型名/类参数化模板和整数类型参数化模板之间这种差异的正确术语是什么,这在行为上还有哪些其他差异,以及我可以使用什么方法解决此问题并获得此简单示例所需的行为,以便 Foo<0>Foo<1>将描述不兼容的类型?

而且,在去图书馆之前,也欢迎任何指向“基本”在线阅读 Material 的链接。 谢谢。

最佳答案

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

所以你没有误会什么。如果这为您编译,那是您的编译器的非标准行为。

关于c++ - `typename` 参数化模板和整数类型模板之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3285351/

相关文章:

c++ - 为什么编译器不解析对模板函数的调用?

angularjs - 如何在 rails slim 模板中添加 Angular 属性指令以输入?

C++:解析 XML 文件时出现问题(MXML 库)

c++ - 如何防止其他人在堆上创建类的新实例?

c++ - 在VS2019 C++跨平台程序中包含nuget包

python - 如何检查 django 模板中的 TEMPLATE_DEBUG 标志?

C++ 在 priority_queue 中使用 std::greater() 并排序

c++ - 我可以输入检查模板参数吗? (C++)

c++ - 使用命名空间不适用于定义?

c++ - 关于 std::reduce vs2017 中的未知数?