在头文件

时间:2015-12-10 17:35:50

标签: c++ lambda

在尝试学习和使用lambda函数时,我在代码中看到了(奇怪的)编译错误。我花了一些时间调试它,但仍然不知道什么是错的。所以我有一个名为config.h的头文件,就像

namespace config {
    ...
    const int kNumPeriodsPerMove = [&] () {
        const double time_nbr_disc = kSizeSlotHello * kNumSlotsHelloPerNbrDisc;
        const double time_data_tx = kSizeSlotData * kNumSlotsDataPerDataTx;
        const double time_epoch = time_nbr_disc + time_data_tx;
        const int num_periods_per_move = ceil(kTimeBtwMoves / time_epoch);
        return num_periods_per_move;
    };
    ...
}

k*形式的变量(如kSizeSlotHello)是const之前定义的config变量,也是config.h:183:5: error: invalid user-defined conversion from ‘config::<lambda()>’ to ‘int’ [-fpermissive] }; ^ config.h:175:41: note: candidate is: config::<lambda()>::operator int (*)()() const <near match> const int kNumPeriodsPerMove = [&] () { ^ config.h:175:41: note: no known conversion from ‘int (*)()’ to ‘int’ 内的变量。当我编译时,我有错误消息:

const int kNumSlots = [&] (double (*f)(double)) {...} (f);

我还在其他地方使用了lambda函数,例如Python 2.7.3,它没有任何编译错误。我对这个问题很好奇。感谢。

1 个答案:

答案 0 :(得分:3)

通过这样做:

const int kNumPeriodsPerMove = [&] () {
    // your code here
    return num_periods_per_move;
};

你实际上并没有执行它 相反,您正在创建一个无法转换为lambda function的{​​{1}}实例 所以,错误是有意义的。

相反,你应该:

int

甚至(更简洁):

auto fn = [&] () {
    // your code here
    return num_periods_per_move;
};

int kNumPeriodsPerMove = fn();

也就是说,人们可以争辩说,以这种方式使用lambda没有多大意义,你应该修改那部分代码。