当我遇到以下问题时,我一直在学习如何在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
。