1

可能重复:
当对象类型是模板参数时,有没有办法将模板参数传递给对象上的函数?

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

4

0 回答 0