0

有人可能问,但我感兴趣的是如何使这个代码工作,2012 VC:VC++ 2012:“使用参数相关查找找到”解决方法?

#include <vector> 

namespace ns { 
    struct Obj { }; 
    template <class T> void swap(T& a, T& b) { } 
} 


int main(int argc, char* argv[]) 
{ 
    std::vector<ns::Obj> v; 
    std::vector<ns::Obj>().swap(v); <-'std::swap' : ambiguous call to overloaded function 
    return 0; 
} 

我都用这个NS命名空间,并且不能更改它。它必须能够在没有STL的情况下工作,并拥有自己的swap()。如何正确使用它与STL一起呢?

+0

实际上它看起来像MSVC的bug,因为g ++和clang ++根本不调用ns :: swap。我会尝试发布另一个可能的解决方案 –

回答

0

好吧,这里是性病的解决方案::向量()掉期(五):

namespace ns { 
inline void swap(Obj*& a, Obj*& b) { } 
inline void swap(Obj& a, Obj& b) { } 
} 

然而,这不是一般的修复,因为我能有这样的事情:

std::map<int, std::map<int, ns::Obj>> m; 
m[0] = m[1]; 

编辑:

这里是另一个黑客工具,在上述情况下工作

namespace ns { 
template <class T> void swap(T* a, T* b) { } 
inline void swap(Obj& a, Obj& b) { } 
} 
+0

看来g ++和clang ++永远不会调用ns :: swap .... –

0
#ifdef NS_USE_STL 

#include <utility> 

namespace ns { 

using std::swap; 

} 

#else 

// define your own swap 

#endif