Bonjour.
Je cherche à déplacer un objet incopiable dans un std::set pour que ce dernier en devienne le propriétaire, mais le code suivant provoque plusieurs erreur.
Apparemment le compilateur a du mal avec la fonction variadique et la substitution d'arguments.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <set> struct Element { Element(int i = 0) : i(i) {}; Element(Element const&) = delete; Element(Element&&) = default; int i; }; bool operator < (const Element& Element1, const Element& Element2) { return Element1.i < Element2.i; } struct Container { std::set<Element> elems; void addElements() {} template<class ... Tail> void addElements(Element const&& elem, Tail&& ... tail) { elems.insert(elem); addElements(std::forward<Tail>(tail)...); } }; int main(int, char**) { Container container; container.addElements(Element(9), Element(36)); Element elem = 25; container.addElements(elem); return 0; }Je voudrais savoir si il est possible de modifier Container pour qu'il déplace tout ce qui va dans addElements sans toucher au code client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 main.cpp: In function int main(int, char**): main.cpp:31:28: error: no matching function for call to Container::addElements(Element&) container.addElements(elem); ^ main.cpp:31:28: note: candidates are: main.cpp:17:7: note: void Container::addElements() void addElements() {} ^ main.cpp:17:7: note: candidate expects 0 arguments, 1 provided main.cpp:20:7: note: template<class ... Tail> void Container::addElements(const Element&&, Tail&& ...) void addElements(Element const&& elem, Tail&& ... tail) { ^ main.cpp:20:7: note: template argument deduction/substitution failed: main.cpp:31:28: note: cannot convert elem (type Element) to type const Element&& container.addElements(elem); In file included from /**** blah blah ****/ main.cpp:21:20: required from void Container::addElements(const Element&&, Tail&& ...) [with Tail = {Element}] main.cpp:28:47: required from here /usr/include/c++/4.9/ext/new_allocator.h:120:4: error: use of deleted function Element::Element(const Element&) { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } ^ main.cpp:5:2: note: declared here Element(Element const&) = delete; ^
J'ai déjà tenté de surcharger addElements(Element const&) sans plus de résultats.
Cordialement.
Partager