os_posix.cpp unconditionally includes semaphore_posix.hpp
If os_posix also transitively includes the semaphore.hpp and gets semaphore_bsd.hpp then a name clash occurs because both try to create the SemaphoreImpl typedef.
If os_posix also transitively includes the semaphore.hpp and gets semaphore_bsd.hpp then a name clash occurs because both try to create the SemaphoreImpl typedef.