Haha more bug
Haha more bug

Reputation: 21

Need some help about "swap" function in c++

I am new to C++ programming. I am trying to compile another person's program, and the software reported a bug that I don't know how to solve (the software I use is Visual Studio 2019).

The line of code with bug is:

swap(allBeamPoints, unordered_map<int, vector<LidarPoint>>());

The definition for variable allBeamPoints is:

unordered_map<int, vector<LidarPoint>>allBeamPoints

The error information is:

Error   C2665   'std::swap': none of the 2 overloads could convert all the argument types   

and

Error (active)  E0304   no instance of overloaded function "swap" matches the argument list 

However, if I type the following codes, no bug will be reported:

unordered_map<int, vector<LidarPoint>> allBeamPoints_new;

swap(allBeamPoints, allBeamPoints_new);

Does anyone know what the problem is? Did I fail to link some of the required libraries? How should I check those libraries?

Upvotes: 2

Views: 186

Answers (1)

Bathsheba
Bathsheba

Reputation: 234665

The older MSVC compilers allowed the binding of an anonymous temporary to a non-const reference function parameter. That's not standard C++.

So

swap(allBeamPoints, unordered_map<int, vector<LidarPoint>>());

which had the effect of clearing allBeamPoints was reasonably idiomatic in code that only targeted Microsoft platforms.

It's wrong and not portable as you now observe. Use

allBeamPoints.clear();

instead to clear the map. Your second snippet compiles since allBeamPoints_new is not an anonymous temporary.

Upvotes: 4

Related Questions