SFML не дружит с WinSock2

Я решил отказаться от SFML Network, и использовать WinSock2. Проблема заключается в том, что если я подключаю WinSock2 (+ использую #pragma warning(disable: 4996)), то компилятор vs 17 начинается жаловаться на ошибки, допущенные в файле rect.inl, который на сколько я понял и является частью sfml библиотеки. При этом в файле подсвечиваются все строчки с Rect и ошибкой "Rect не является шаблоном". Как я могу решить это?


Ответы (1 шт):

Автор решения: KoVadim

Оформлю свои комментарии в виде ответа.

Как только в проект подключается winsock.h, то сразу подключается и windows.h. А это очень тяжелый и "неудобный" заголовок - он несет много много старого груза. К примеру, там есть структруа Rect, которая пересекается с такой же в sfml. Поэтому, используем имена полностью в коде - sf::Rect, а не using namespace sf;.

Жалоба на std::min и std::max - это с той же оперы. где-то внутри windows.h есть что то вида

#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a

а как известно, препроцессору побоку на namespace и увидев std::max(1,2) он просто заменяет на std::1>2?1:2, что и срывает крышу плюсовому компилятору и программисту (не так просто сразу увидеть, что это макрос и во что он разворачивается).

К сожалению, просто так убрать это с windows.h нельзя, поэтому придумали обходной маневр - оно там завернуто в #ifndef NOMINMAX .. #endif и добавив #define NOMINMAX это дело прячется. Но нужно объявлять до первой встречи с этим include. Иначе это не работает.

P.S. Никогда не добавляйте Windows.h в свои header файлы. Во первых, он очень большой - значит компиляция замедлится, во вторых, там сколько всего, что неизвестно, что ещё может вылезти (к примеру, bind и std::bind).

→ Ссылка