L'extrait suivant:Est-il acceptable de définir une fonction swap() totalement générale?
#include <memory>
#include <utility>
namespace foo
{
template <typename T>
void swap(T& a, T& b)
{
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
struct bar { };
}
void baz()
{
std::unique_ptr<foo::bar> ptr;
ptr.reset();
}
ne compile pas pour moi:
$ g++ -std=c++11 -c foo.cpp
In file included from /usr/include/c++/5.3.0/memory:81:0,
from foo.cpp:1:
/usr/include/c++/5.3.0/bits/unique_ptr.h: In instantiation of ‘void std::unique_ptr<_Tp, _Dp>::reset(std::unique_ptr<_Tp, _Dp>::pointer) [with _Tp = foo::bar; _Dp = std::default_delete<foo::bar>; std::unique_ptr<_Tp, _Dp>::pointer = foo::bar*]’:
foo.cpp:20:15: required from here
/usr/include/c++/5.3.0/bits/unique_ptr.h:342:6: error: call of overloaded ‘swap(foo::bar*&, foo::bar*&)’ is ambiguous
swap(std::get<0>(_M_t), __p);
^
In file included from /usr/include/c++/5.3.0/bits/stl_pair.h:59:0,
from /usr/include/c++/5.3.0/bits/stl_algobase.h:64,
from /usr/include/c++/5.3.0/memory:62,
from foo.cpp:1:
/usr/include/c++/5.3.0/bits/move.h:176:5: note: candidate: void std::swap(_Tp&, _Tp&) [with _Tp = foo::bar*]
swap(_Tp& __a, _Tp& __b)
^
foo.cpp:7:10: note: candidate: void foo::swap(T&, T&) [with T = foo::bar*]
void swap(T& a, T& b)
Est-ce ma faute pour déclarer une fonction swap()
si générale qu'elle est en conflit avec std::swap
?
Si oui, existe-t-il un moyen de définir foo::swap()
afin qu'il ne soit pas importé par Koenig lookup?
Ne compile pas sur GCC ou Clang, mais compile sur MSVC 2015. Une autre fonctionnalité non documentée peut-être. – wally
Putain, ce sont de bons ratios en moins de la première heure. +16 upvotes, visualisés 77 fois, et 4 favoris. –
Vous ne devriez avoir aucune raison de définir un tel modèle de 'swap' général dans un espace de noms très spécifique contenant seulement des types spécifiques. Définissez simplement une surcharge swap non-template pour 'foo :: bar'. Laissez l'échange général sur 'std :: swap' et ne fournissez que des surcharges spécifiques. – TemplateRex