我有一个很奇怪的问题。为了简单起见,可以说,我想有一个函数,它接受2个相同的函数声明作为参数Lambda作为模板函数
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
要尝试的事情了我带着putchar
从cstdio,并创建了一个相同的功能相匹配的putchar
。
int myPutcharFunc(int)
{
return 0;
}
int main()
{
auto myPutcharLambda = [](int) -> int
{
return 0;
};
foo(putchar, myPutcharFunc); // okay
foo(putchar, myPutcharLambda); //deduced conflicting types for parameter 'Func' ('int (__attribute__((__cdecl__)) *)(int)' and 'main()::<lambda(int)>')
}
现在,lambda不想编译(关键是我想用lambda捕获)。
因此,让我们添加模板专业化,因为程序员比机器更聪明,对吧? :)
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
没有运气,同样的错误 - 为什么? 但由于某些原因,当我注释掉模板特殊化:
//template<>
void foo(int(*)(int), int(*)(int))
{
std::cout << "good";
}
代码编译。我显然不想为每一组函数的参数重载foo
- 这就是模板的用途。每个步骤都使用msvC++和g ++进行测试。我究竟做错了什么?
* “演绎模板类型时,类型不衰”。 *“相同的原因,字符串文字被推断为char [N]而不是const char *”*,原始字符串文字被推断为const char * –
@PiotrSkotnicki它是什么时候作为char数组出现呢?我只是在其他一些问题上读到这个。 – xaxxon
功能参数为参考类型时 –