Overall a good job, and much better than the version you answered.
Better Not to Ignore Warning Messages
Board.cpp generates 2 warning messages, the first is for a typo on the semicolon on this line:
#include <iostream>;
The second is for a type mismatch on this line
for (auto i = 0; i < body.size(); ++i) {
Auto comes in very handy for some things, but it is best not to abuse it. C++ is not a scripting language and type checking in C++ is a good thing. Use auto to define iterators when looping through a container but use the proper type in other instances. It's generally a good idea for someone who has to maintain the code to know what type an objects is. Unlike C# and some other languages C++ does not have Reflection.
IncudeInlcude Header Files Within Headers
The code might be more maintainable if header files such as Board.h and ConsoleOperations.h included header files for objects they consume such as SnakeDirection.h and Point.h. As it is now someone using Board.h in a new file will run into compiler issues if they haven't already included the proper files.
Check User Input
Neither the function getKey() nor updateDirection(key, snakeDirection) performs adequate error checking, if the user enters an illegal value, the behavior is unknown. It is always good to check user input.