下面的代码无法使用gcc 7.1.0编译,它抱怨在main的第二行提供错误数量的模板参数.这个版本的GCC 应该实现类模板的模板参数推导.
我认为编译器应该能够推导出Bar的类模板参数T2,这意味着我不应该Bar<int, int>在C++ 17草案的段落17.8.1.3中明确指定两个arguments(),它们说:"尾随模板可以推导出的参数(17.8.2)或从默认模板参数获得的参数可以从显式模板参数列表中省略."
我错了吗?编译器错了吗?这是疏忽还是故意设计?
template <typename T>
struct Foo {
Foo(T t) {}
};
template <typename T1, typename T2>
struct Bar {
Bar(T2 t) {}
};
template <typename T1, typename T2>
void bar(T2 t) {}
int main(int argc, char **argv) {
Foo(42); // Works
Bar<int>(42); // Fails to compile with "wrong number of
// template arguments (1, should be 2)"
bar<int>(42); // Works
}
Run Code Online (Sandbox Code Playgroud)