VC ++ 2012:"使用参数依赖查找"变通?

时间:2014-03-27 20:06:51

标签: c++ visual-studio-2012 overloading ambiguous argument-dependent-lookup

可能有人问过,但我对如何使这个代码与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一起正确使用它?

2 个答案:

答案 0 :(得分:0)

好的,这是std :: vector()。swap(v):

的解决方案
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) { }
}

答案 1 :(得分:0)

#ifdef NS_USE_STL

#include <utility>

namespace ns {

using std::swap;

}

#else

// define your own swap

#endif