2017-07-22 23 views
0

这是我试图解决的一个简化问题的示例。在收集排序参数中带有自动类型的Lambda

#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 

不幸的是,它不断地产生以下错误:

test.cpp:9:34: error: unknown type name 'comp' 
set<int, decltype(comp)> reads(comp); 
          ^

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

+0

你可以发布一个小例子,一个可以用来重现错误?上面的代码片段是不够的。 – skypjack

+0

不确定你的意图是在这里。你可以扩展你想要做的事吗? – user4581301

+0

我愿意有一些自己的比较功能。这将允许我按照所需顺序遍历元素。 –

回答

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

我的visual studio 2017抱怨'comp'不是一个类型名称,它看不到'member'的定义,所以我猜编译器将'member'识别为一个函数定义。

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

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; 
} 

UPDATE:

对于情况与结构,尝试:

#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'

+0

没有结构,即使没有参考(&)也可以工作。 但是,struct/class对我的使用非常重要。 –

+0

@ArturLaskowski更新 – VolAnd