【发布时间】:2018-12-05 03:19:55
【问题描述】:
你能帮我理解为什么参数推导适用于类模板而不适用于函数模板吗?
如果我理解正确,类模板定义了一个函数,所以当我调用时编译器可以进行隐式转换,但是对于函数模板,目前没有函数定义,所以隐式演员没有发生。
但我不明白为什么编译器不能创建函数定义然后应用隐式转换?
#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)'
【问题讨论】:
标签: c++ templates std-function template-argument-deduction