Reading and writing binary data in C++
Both std::istream and std::ostream are actually not defined in &lt;iostream&gt;, despite the fact that they look similar.  They're respectively defined in &lt;istream&gt; and &lt;ostream&gt;.

You should instead include these in the implementation file and include &lt;iosfwd&gt; (the iostream declaration forwarding library) in the header.
These data members should be private:


glm::vec3 position;
glm::vec3 normal;
glm::vec2 texCoord;



Otherwise, they will be accessible outside of the class.  If they are not meant to be this way, then you should use a struct instead, which are public by default.
If you don't need a default constructor, then leave it out.  The compiler will provide one for you.
Regarding operator==:

Conditional operators overloads, such as operator==, should be const as they should not modify any data members:

bool operator==(const Vertex&amp; other) const;


Its definition could also be split into multiple lines, which is easier to read than one long line:

bool Vertex::operator==(const Vertex&amp; other) {
    return position == other.position
        &amp;&amp; normal == other.normal
        &amp;&amp; texCoord == other.texCoord;
}