可能有人问过,但我对如何使这个代码与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 :(得分: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