我想使用std::sort,但是编译失败,并出现错误C2668: std::swap: ambiguous call to overloaded function,因为在我的命名空间中定义了模板化的swap()函数,这很难摆脱。我不在乎它使用哪个swap,但是在编译sort()时如何使其中一个消失?

我知道这是模棱两可的,因为my::swapmy::Obj在同一命名空间中,并且我不在乎使用哪个版本的swap。我只需要克服名称空间冲突。这是我不拥有的非常庞大的代码库的一部分,因此我希望找到一种对我的代码而言本地的解决方案,并且可能允许my::Objmy::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/

10-13 05:41