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

发布于 2024-09-18 06:27:37 字数 715 浏览 3 评论 0原文

我在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
}

现在我明白了第一个代码的错误。下面的代码怎么样?是否是由于 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
}

I wrote the following code on VC10. Calling f1 is okay, but on calling f2 the compiler showed an error. The difference between the two functions is only "template ", but the template type is actually not used. Why does the error occur?

#include <functional>

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

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

int main()
{
    f1( []{} );
    f2( []{} ); // Error C2783
}

Now I understand the error on the first code. How about the following code? Is it the error reason that the compiler can't decide the template type because lambda generates an internal anonymous class, but it is different from 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
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千年*琉璃梦 2024-09-25 06:27:37

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

f2<int>([]{});
f2<float>([]{});

是否使用它们并不重要。就像未使用的函数参数:

void f(int) { }
int main() { f(); /* error! */ }

This is not specific to lambdas at all. You need to tell the compiler what version of the template you want to call:

f2<int>([]{});
f2<float>([]{});

It doesn't matter whether you use them or not. It's like unused function parameters:

void f(int) { }
int main() { f(); /* error! */ }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文