2017-07-22 42 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