Как побороть поиск Кенига?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.04.11 14:20
Оценка:
Здравствуйте, коллеги!

В начале приведу пример, похожий на мою ситуацию:

#include <vector>
#include <iostream>
#include <algorithm>


namespace my
{
    class A
    {
    };
 
    template<typename Something>
    void swap(Something &s1, Something &s2)
    {
        std::cout<<"::my::swap\n";
    }

    void myFunction( A** pa, size_t s )
    {
        std::cout<<"size"<<(unsigned)s<<"\n";
    }

    void myFunction( const ::std::vector< A* > &vec)
    {
        myFunction( const_cast< A** >(&vec[0]), (size_t)vec.size() );
    }
}


int main()
{
    ::std::vector< ::my::A* > v1, v2;
    //v1.push_back(0);
    //v2.push_back(0);
    //v2.push_back(0);

    ::my::myFunction(v1);
    ::my::myFunction(v2);

    //namespace my {
    //swap(v1,v2);

    //};

    //v1.swap(v2);
    //::std::swap(v1,v2);
    ::std::reverse(v1.begin(), v2.begin());    //v1.resize( 3, 0);

    
    ::my::myFunction(v1);
    ::my::myFunction(v2);
}


На выделенную строку студия 2008 ругается, что возникла неоднозначность между std::swap и my::swap в недрах stl.
С одной стороны все вроде бы правильно, но меня это не устраивает, потому, что в NS my я ввел для своих объектов специально, чтобы он не пересекался со стандартным. Можно специализировать std::swap, но я этого не делал, потому что не был уверен, какая версия swap будет вызыватся при использовании различных компиляторов, как довольно старых, так и новых (код работает с GCC от 3.3 до 4.4.1, msvc 2005, на 2008 не компилируется ). Имя swap выбрал для того, чтобы показать, что семантика соответствует std::swap, но работает для объектов из ::my, и когда необходимо, явно специфицировал вызов (::my::swap). Причем, подразумевалось, что если не указано ::my::swap, то должна работать версия std::swap
Как тут поступить?
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.