当我遇到以下问题时,我最近一直在学习如何在 C++ 中使用 lambda。
当我编写一个捕获模板化变量的 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-issueg++
版本4.6.3
。