【发布时间】:2016-05-14 20:38:44
【问题描述】:
我有一个很奇怪的问题。为了简单起见,假设我想要一个函数,它需要两个函数,其声明与参数相同
template<typename Func>
void foo(Func a, Func b)
{
std::cout << "good";
}
为了尝试一下,我从 cstdio 中提取了 putchar,并创建了一个相同的函数来匹配 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++ 进行了测试。我做错了什么?
【问题讨论】:
标签: c++ templates c++11 lambda