bool Collision::IsCollided(Player *player, std::vector<Platform*> platformList)
Instead of passing it by value I suggest you pass it by (const) reference, because copying an entire vector of objects can be quite slow.
There are actually two parts when dealing with collisions, the first one is collision detection and the second one is collision response.
The reason why you can't move the player after it's first collision is because you don't move the player back until it's in a none collision phase, because you don't do that the player will always be in collision and not allowed to move.
This is commonly done by finding the intersection amount and moving the player back by that amount, in XNA you can get that information from the class, in SFML i think you will need to do it yourself, I imagine it to be something along the line of the delta between the player and platform.
if(Collision::IsCollided(player, currentLevel->GetAllPlatforms()))
I don't know what happens behind the scene here but going by the name of the function you should consider doing some culling so that you don't check for EVERY platform in the entire level, just the ones that has can be collided by the player ( i.e what is on screen ).
I'll leave the in depth information to the others!