将lambda传递给VC10上的模板函数

Wak*_*sei 2 lambda templates visual-studio-2010 c++11

我在VC10上编写了以下代码.调用f1是可以的,但是在调用f2时,编译器显示错误.两个函数之间的区别仅是"模板",但实际上并未使用模板类型.为什么会出现错误?

#include <functional>

void f1( std::tr1::function<void()> f)
{
}

template <typename >
void f2( std::tr1::function<void()> f)
{
}

int main()
{
    f1( []{} );
    f2( []{} ); // Error C2783
}
Run Code Online (Sandbox Code Playgroud)

现在我理解了第一个代码的错误.以下代码怎么样?是编译器无法决定模板类型的错误原因,因为lambda生成内部匿名类,但它与std :: tr1 :: function不同?

#include <functional>

class MyClass
{
};

template <typename T>
void f2( std::tr1::function<void(T)> f)
{
}

int main()
{
    std::tr1::function<void(MyClass)> f= [](MyClass v){};

    f2( f );
    f2( [](MyClass v){} ); // C2784
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 5

这根本不是lambda所特有的.您需要告诉编译器您要调用的模板版本:

f2<int>([]{});
f2<float>([]{});
Run Code Online (Sandbox Code Playgroud)

无论您是否使用它们都无关紧要.这就像未使用的函数参数:

void f(int) { }
int main() { f(); /* error! */ }
Run Code Online (Sandbox Code Playgroud)