Здравствуйте, коллеги!
В начале приведу пример, похожий на мою ситуацию:
#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
Как тут поступить?