Следующий фрагмент кода:Можно ли определить полностью общую функцию swap()?
#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();
}
не составляет для меня:
$ 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)
Это моя вина для объявления swap()
функции так общее, что конфликтует с std::swap
?
Если да, то есть способ определить foo::swap()
, чтобы он не подталкивался поиском Koenig?
Не компилируется на GCC или Clang, но компилируется на MSVC 2015. Возможно, другая недокументированная функция. – wally
Черт, это хорошие отношения в течение менее первого часа. +16 upvotes, просмотрено 77 раз и 4 фаворита. –
У вас не должно быть оснований для определения такого общего шаблона 'swap' в очень специфическом пространстве имен, содержащем только определенные типы. Просто определите перегрузку без шаблона 'swap' для' foo :: bar'. Оставьте общую замену на 'std :: swap' и укажите только определенные перегрузки. – TemplateRex