你能帮我理解为什么类模板可以进行参数推导,而函数模板不行吗?
如果我理解正确的话,类模板定义了一个函数,因此当我调用它时,编译器可以进行隐式转换,但是在函数模板的情况下,目前没有函数定义,所以隐式转换不会发生。
但我不明白为什么编译器不能创建函数定义然后应用隐式转换呢?
#include <functional>
template<typename ...ARGS>
class Test1
{
public:
void add(const std::function<void(ARGS...)>&) {}
};
class Test2
{
public:
template<typename ...ARGS>
void add(const std::function<void(ARGS...)>&) {}
};
void func(int) {}
int main()
{
Test1<int> test1;
test1.add(func);
Test2 test2;
test2.add<int>(func);
}
错误是:
在函数'int main()'中:
25:24: 错误:没有找到与'Test2::add(void (&)(int))'匹配的函数
25:24: 注:候选函数是:
14:10: 注:模板void Test2::add(const std::function&)
14:10: 注:模板参数推断/替换失败:
25:24: 注:类型不匹配'const std::function'和'void(int)'
add
成员生成函数声明”,“编译器只是实例化成员函数模板定义”。我不知道在引用模板实例化时声明/定义是否是正确的术语,但我尽力让它尽可能清晰。虽然你可能是对的,实际代码生成与函数解析关系不大。 - Max Langhof