Korzystanie z Visual Studio 2010 SP1:Czy jest to błąd kompilatora VC++ 2010?
#include <vector>
//namespace XXX {
struct Test
{
bool operator==(const Test& r) const { return true; }
};
//}
//typedef XXX::Test Test;
template <typename T> inline bool operator!=(const T& l,const T& r)
{ return !(l==r); }
int main()
{
std::vector<Test> vt;
std::vector<Test> vt2 = std::move(vt);
return 0;
}
Gdybym skompilować kod powyżej, jak jest, nie jest on z tego błędu:
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 !=<std::allocator<_Ty>>(const T &,const T &)' [found using argument-dependent lookup]
1> with
1> [
1> _Ty=Test,
1> T=std::allocator<Test>
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> ]
... gdzie vector(609)
postanawia tej linii:
else if (get_allocator() != _Right.get_allocator())
OTOH, jeśli odkomentuję linie powiązane z namespace XXX
, kompiluje się bez skargi.
Muszę myśleć, że jest to błąd kompilatora, ale szukam niezależnej weryfikacji.
EDIT: Tylko tytułem wyjaśnienia, natknąłem tej sytuacji kiedy rekompilacji jakiś stary kod z VS2010 po raz pierwszy. Globalny operator był jakimś cruftem z lat minionych (teraz usunięty). Po prostu nie mogłem zrozumieć, dlaczego jakiś kod zawiódł, a inni nie. Powyższy kod jest moją destylacją nieudanego przypadku (oczywiście stary kod nie zawierał połączeń z numerem std::move()
).
UPDATE: Zalogowałem błąd z MS i oni odpowiedzieli, że zostało to ustalone „w następnej wersji kompilatora” - co przypuszczam oznacza Visual C++ 11. zobacz: http://connect.microsoft.com/VisualStudio/feedback/details/731692/regression-involving-global-operator-and-std-vector
Czy próbowałeś tego z innym kompilatorem? –
@GregHewgill: Nie mogę się rozmnażać z GCC. – mcmcc
@GregHewgill: Skłamałem w moim poprzednim komentarzu, nie mam innego kompilatora pod ręką, który obsługuje C++ 11, więc odpowiedź brzmi "nie". – mcmcc