【问题标题】:Passing a lambda to a template function on VC10将 lambda 传递给 VC10 上的模板函数
【发布时间】:2010-09-10 18:30:09
【问题描述】:

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

【问题讨论】:

    标签: visual-studio-2010 templates lambda c++11


    【解决方案1】:

    这根本不是特定于 lambdas 的。你需要告诉编译器你要调用什么版本的模板:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多