lambda捕获模板化参数的编译错误

时间:2012-10-11 20:29:20

标签: c++ templates gcc lambda c++11

  

可能重复:
  Is there a way to pass template arguments to a function on an object when the object type is a template argument?

当我遇到以下问题时,我一直在学习如何在C ++中使用lambdas。

当我写一个捕获模板化变量的lambda(通过引用或通过复制,无所谓)时,我得到一个奇怪的编译错误,与lambda本身无关。测试代码如下:

// templated.cpp  
#include <iostream>
#include <vector>

template<class T, class Function>
Function for_each_index(const T& v, Function f)
{
    for (unsigned int i = 0; i < v.size(); ++i) { f(i); }
    return f;
}

class Test
{
public:
    template<class T>
    T f() { return 1; }
};

template<class T>
void fun(T& v)
{
    for_each_index(v, [&v] (unsigned int i) {
        v[i].f<float>();
    });
}

int main()
{
    std::vector<Test> v;
    v.push_back(Test());
    v.push_back(Test());
    v.push_back(Test());
    fun(v);
    return 0;
}

上述代码的编译失败,并显示以下消息:

$ g++ -Wall templated.cpp -std=c++0x
templated.cpp: In lambda function:
templated.cpp:23:16: error: expected primary-expression before ‘float’
templated.cpp:23:16: error: expected ‘;’ before ‘float’

但是,如果我将lambda移动到main(那里没有模板),它编译得很好:

// simple.cpp
#include <iostream>
#include <vector>

template<class T, class Function>
Function for_each_index(const T& v, Function f)
{
    for (unsigned int i = 0; i < v.size(); ++i) { f(i); }
    return f;
}

class Test
{
public:
    template<class T>
    T f() { return 1; }
};

int main()
{
    std::vector<Test> v;
    v.push_back(Test());
    v.push_back(Test());
    v.push_back(Test());
    for_each_index(v, [&v] (unsigned int i) {
        v[i].f<float>();
    });
    return 0;
}

我在这里使用for_each_index,因为我在自己的代码中使用了类似的“迭代工具”,上面的错误来自于此(原始代码执行了一些繁重的图像处理,此代码是一个概念证明)。但是,它在这里服务于第二个目的 - 避免将模板化变量放在lambda参数中。

那么,这是一个编译器错误吗?或者我做错了什么?如果是这样,你可以建议一些可能的解决方法吗?

仅供参考,我使用的是标准的Ubuntu问题g++,版本为4.6.3

0 个答案:

没有答案