Использование Visual Studio 2010 SP1:
#include
//namespace XXX {
struct Test
{
bool operator==(const Test& r) const { return true; }
};
//}
//typedef XXX::Test Test;
template inline bool operator!=(const T& l,const T& r)
{ return !(l==r); }
int main()
{
std::vector vt;
std::vector vt2 = std::move(vt);
return 0;
}
Если я скомпилирую приведенный выше код как есть, произойдет сбой с этой ошибкой:
1>C:\apps\MVS10\VC\include\vector(609): error C2593: 'operator !=' is ambiguous
1> C:\apps\MVS10\VC\include\xmemory(268): could be 'bool std::operator !=<_Ty,_Ty>(const std::allocator<_Ty> &,const std::allocator<_Ty> &) throw()'
1> with
1> [
1> _Ty=Test
1> ]
1> test.cpp(11): or 'bool operator !=>(const T &,const T &)' [found using argument-dependent lookup]
1> with
1> [
1> _Ty=Test,
1> T=std::allocator
1> ]
1> while trying to match the argument list '(std::allocator<_Ty>, std::allocator<_Ty>)'
1> with
1> [
1> _Ty=Test
1> ]
1> C:\apps\MVS10\VC\include\vector(606) : while compiling class template member function 'void std::vector<_Ty>::_Assign_rv(std::vector<_Ty> &&)'
1> with
1> [
1> _Ty=Test
1> ]
... где vector(609)
разрешается в эту строку:
else if (get_allocator() != _Right.get_allocator())
OTOH, если я раскомментирую строки, связанные с пространством имен XXX
, он компилируется без проблем.
Я должен думать, что это ошибка компилятора, но я ищу независимую проверку.
РЕДАКТИРОВАТЬ:Просто в качестве объяснения, я столкнулся с этой ситуацией, когда впервые перекомпилировал какой-то старый код с VS2010. Глобальный оператор был каким-то мусором прошлых лет (сейчас удален). Я просто не мог понять, почему один код не работает, а другой нет. Приведенный выше код — это моя дистилляция неудачного случая (очевидно, что старый код не будет содержать вызовов std::move()
).
ОБНОВЛЕНИЕ: Я зарегистрировал ошибку в MS, и они ответили, что она была исправлена «в следующем выпуске компилятора», что, как я полагаю, означает Visual C++ 11. См.: http://connect .microsoft.com/VisualStudio/feedback/details/731692/regression-involving-global-operator-and-std-vector