我想使用std::sort
,但是编译失败,并出现错误C2668: std::swap: ambiguous call to overloaded function
,因为在我的命名空间中定义了模板化的swap()
函数,这很难摆脱。我不在乎它使用哪个swap
,但是在编译sort()
时如何使其中一个消失?
我知道这是模棱两可的,因为my::swap
与my::Obj
在同一命名空间中,并且我不在乎使用哪个版本的swap
。我只需要克服名称空间冲突。这是我不拥有的非常庞大的代码库的一部分,因此我希望找到一种对我的代码而言本地的解决方案,并且可能允许my::Obj
和my::swap
都保留在命名空间my
中。
namespace my
{
template<class T> void swap(T a, T b)
{
}
struct Obj
{
};
void doSortStuff()
{
std::vector<Obj> arr;
std::sort(arr.begin(), arr.end());
}
};
最佳答案
一种解决方法是创建更好的重载:
// No modifiable code
namespace my
{
template<class T> void swap(T a, T b) { /*.. */ }
struct Obj { /*..*/ };
}
// Your code:
namespace my
{
void swap(Obj& lhs, Obj& rhs)
{
// my::swap<Obj&>(lhs, rhs);
std::swap(lhs, rhs);
}
}
// In namespace you want.
void doSortStuff()
{
std::vector<my::Obj> arr;
std::sort(arr.begin(), arr.end());
}
然后,在3个有效的重载之间,所有都是完全匹配的,但首选非模板。
关于c++ - 如何使std::sort在std::swap和命名空间的模板交换之间没有名称冲突?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52998768/