निम्नलिखित स्निपेट:क्या एक पूरी तरह से सामान्य स्वैप() फ़ंक्शन को परिभाषित करना ठीक है?
#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()
को परिभाषित करने का कोई तरीका है ताकि इसे कोएनिग लुकअप द्वारा नहीं लिया जा सके?
जीसीसी या बजना पर संकलन नहीं करता है, लेकिन MSVC 2015 एक और गैर-दस्तावेजी सुविधा शायद पर संकलित करता है। – wally
अरे, वे पहले घंटे से कम के भीतर कुछ अच्छे अनुपात हैं। +16 अपवॉट्स, 77 बार देखा गया, और 4 पसंदीदा। –
आपके पास ऐसे सामान्य 'स्वैप' टेम्पलेट को परिभाषित करने का कोई कारण नहीं होना चाहिए जिसमें केवल विशिष्ट प्रकार वाले विशिष्ट नामस्थान हैं। 'Foo :: bar' के लिए बस एक गैर-टेम्पलेट' स्वैप 'अधिभार परिभाषित करें। 'Std :: swap' पर सामान्य स्वैपिंग छोड़ दें, और केवल विशिष्ट ओवरलोड प्रदान करें। – TemplateRex