在集合排序参数中具有自动类型的Lambda

时间:2017-07-22 05:23:15

标签: c++ c++11 lambda collections set

这是我尝试解决的简化问题的一个示例。

passport.use(
        'local-signup',
        new LocalStrategy({

            usernameField : 'email',

            passwordField : 'password',

            passReqToCallback : true 
        },
        function(req, username, password, done) {

            User.findOne({email: username}, function(err, user) {
                if (err) { return done(err); }
                if (!user) {
                     return done(null, false, { message: 'Incorrect username.' });
                 }
                if (!user.validPassword(password)) {
                     return done(null, false, { message: 'Incorrect password.' });
                }
                return done(null, user);
            })

        })
)

我使用以下命令编译我的代码:

#include <iostream>
#include <set>
using namespace std;

auto comp = [](int x, int y) { return x < y; };

struct Struct {
    set<int, decltype(comp)> member(comp);
};

int main() {
    Struct variable;
    variable.member.insert(1);
    variable.member.insert(5);

    for(auto v: variable.member) {
            cout << v << endl;
    }
    return 0;
}

不幸的是,它一直产生以下错误:

g++ -std=c++14 -o test.exe test.cpp

我曾尝试安装较新版本的g ++,但它不起作用。 我在MacOS上使用Clang执行此命令,以及在版本5.2中使用g ++执行Ubuntu 16。

2 个答案:

答案 0 :(得分:2)

struct Struct {
  set<int, decltype(comp)> member{ comp };
};

我的视觉工作室2017抱怨'comp'不是类型名称,它看不到'member'的定义,所以我猜编译器将'member'识别为函数定义。

使用member{ comp }似乎解决了这个问题

答案 1 :(得分:1)

没有结构,这个例子可以编译为:

#include <iostream>
#include <set>

using namespace std;

auto& comp = [](int x, int y){ return x < y; };

auto member = set<int, decltype(comp)>(comp);

int main() {
    member.insert(1);
    member.insert(5);

    for (auto v : member) {
        cout << v << endl;
    }
    return 0;
}

<强>更新

对于结构案例,请尝试:

#include <iostream>
#include <set>

using namespace std;

auto& comp = [](int x, int y){ return x < y; };

struct Struct {
    set<int, decltype(comp)> member = set<int, decltype(comp)>(comp);
} variable;

int main() {
    variable.member.insert(1);
    variable.member.insert(5);

    for (auto v : variable.member) {
        cout << v << endl;
    }
    return 0;
}

我的Visual Studio 2013无法编译auto member = set<int, decltype(comp)>(comp); insude结构 - 错误为error C2853: 'member' : a non-static data member cannot have a type that contains 'auto'