title: Getting already defined in errors whilst there's only a single definition
body: <p>I have a few functions under a namespace. They are only defined in a single file(include/math/math.h), but for some reason, I am getting errors about those functions already being defined.
  Please note header guards are in place.</p>
  
  <p>I've already gone through practically all of the code in the solution multiple times over and I couldn't find anything, but it could just be me being in a rush, I suppose. Couldn't find anything after multiple attempts.</p>
  
  <p>include/math/math.h</p>
  
  <pre><code>#ifndef STORMENGINE_MATH_MATH_H
  #define STORMENGINE_MATH_MATH_H
  
  namespace Math
  {
      // Fast inverse square root algorithm.
      // All credits go to Greg Walsh.
      // Original algorithm is available online
      // on multiple websites, including with
      // a full explanation on the English
      // Wikipedia project by WikiMedia.
      float FastInverseSquareRoot(float flNum)
      {
          long i;
          float x2, y;
          const float threehalfs = 1.5f;
  
          x2 = flNum * 0.5f;
          y = flNum;
          i = *(long*)&amp; y;
          i = 0x5f3759df - (i &gt;&gt; 1);
          y = *(float*)&amp; i;
          y = y * (threehalfs - (x2 * y * y));
  
          return y;
      }
  
      // Fast inverse square root algorithm.
      // All credits go to Greg Walsh.
      // Original algorithm is available online
      // on multiple websites, including with
      // a full explanation on the English
      // Wikipedia project by WikiMedia.
      float InverseSquareRoot(float flNum, int nCount = 1)
      {
          long i;
          float x2, y;
          const float threehalfs = 1.5f;
  
          x2 = flNum * 0.5f;
          y = flNum;
          i = *(long*)&amp; y;
          i = 0x5f3759df - (i &gt;&gt; 1);
          y = *(float*)&amp; i;
  
          for (int j = 0; j &lt; nCount; ++j)
          {
              y = y * (threehalfs - (x2 * y * y));
          }
  
          return y;
      }
  
      // Fast inverse square root algorithm.
      // All credits go to Greg Walsh.
      // Original algorithm is available online
      // on multiple websites, including with
      // a full explanation on the English
      // Wikipedia project by WikiMedia.
      float FastSquareRoot(float flNum)
      {
          long i;
          float x2, y;
          const float threehalfs = 1.5f;
  
          x2 = flNum * 0.5f;
          y = flNum;
          i = *(long*)&amp; y;
          i = 0x5f3759df - (i &gt;&gt; 1);
          y = *(float*)&amp; i;
          y = y * (threehalfs - (x2 * y * y));
  
          return (1.f / y);
      }
  
      // Fast inverse square root algorithm.
      // All credits go to Greg Walsh.
      // Original algorithm is available online
      // on multiple websites, including with
      // a full explanation on the English
      // Wikipedia project by WikiMedia.
      float SquareRoot(float flNum, int nCount = 1)
      {
          long i;
          float x2, y;
          const float threehalfs = 1.5f;
  
          x2 = flNum * 0.5f;
          y = flNum;
          i = *(long*)&amp; y;
          i = 0x5f3759df - (i &gt;&gt; 1);
          y = *(float*)&amp; i;
  
          for (int j = 0; j &lt; nCount; ++j)
          {
              y = y * (threehalfs - (x2 * y * y));
          }
  
          return (1.f / y);
      }
  };
  
  #endif // STORMENGINE_MATH_MATH_H
  </code></pre>
  
  <p>vector2.h segments of usage</p>
  
  <pre><code>
      FORCEINLINE float Length() const
      {
          return Math::SquareRoot(x * x + y * y, 6);
      }
  
      FORCEINLINE float LengthFast() const
      {
          return Math::FastSquareRoot(x * x + y * y);
      }
  
      FORCEINLINE float LengthSqr() const
      {
          return (x * x + y * y);
      }
  
  // ----- Multiple irrelevant things inbetween -----
  
      FORCEINLINE static float Length(const Vector2&amp; vec)
      {
          return Math::SquareRoot(vec.x * vec.x + vec.y * vec.y, 6);
      }
  
      FORCEINLINE static float LengthFast(const Vector2&amp; vec)
      {
          return Math::FastSquareRoot(vec.x * vec.x + vec.y * vec.y);
      }
  
      FORCEINLINE static float LengthSqr(const Vector2&amp; vec)
      {
          return (vec.x * vec.x + vec.y * vec.y);
      }
  </code></pre>
  
  <p>vector3.h segments of usage</p>
  
  <pre><code>    FORCEINLINE float Length() const
      {
          return Math::SquareRoot(x * x + y * y + z * z, 6);
      }
  
      FORCEINLINE float LengthFast() const
      {
          return Math::FastSquareRoot(x * x + y * y + z * z);
      }
  
      FORCEINLINE float LengthSqr() const
      {
          return (x * x + y * y + z * z);
      }
  
  // ----- Multiple irrelevant things inbetween -----
  
      FORCEINLINE static float Length(const Vector3&amp; vec)
      {
          return Math::SquareRoot(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z, 6);
      }
  
      FORCEINLINE static float LengthFast(const Vector3&amp; vec)
      {
          return Math::FastSquareRoot(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
      }
  
      FORCEINLINE static float LengthSqr(const Vector3&amp; vec)
      {
          return (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
      }
  </code></pre>
  
  <p>vector4.h segments of usage</p>
  
  <pre><code>    FORCEINLINE float Length() const
      {
          return Math::SquareRoot(x * x + y * y + z * z + w * w, 6);
      }
  
      FORCEINLINE float LengthFast() const
      {
          return Math::FastSquareRoot(x * x + y * y + z * z + w * w);
      }
  
      FORCEINLINE float LengthSqr() const
      {
          return (x * x + y * y + z * z + w * w);
      }
  
  // ----- Multiple irrelevant things inbetween -----
  
      FORCEINLINE static float Length(const Vector4&amp; vec)
      {
          return Math::SquareRoot(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z + vec.w * vec.w, 6);
      }
  
      FORCEINLINE static float LengthFast(const Vector4&amp; vec)
      {
          return Math::FastSquareRoot(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z + vec.w * vec.w);
      }
  
      FORCEINLINE static float LengthSqr(const Vector4&amp; vec)
      {
          return (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z + vec.w * vec.w);
      }
  </code></pre>
  
  <p>There shouldn't be any errors for as much as I am aware, but instead, I am getting these:</p>
  
  <pre><code>1&gt;vector2.obj : error LNK2005: "float __cdecl Math::FastInverseSquareRoot(float)" (?FastInverseSquareRoot@Math@@YAMM@Z) already defined in vector4.obj
  1&gt;vector2.obj : error LNK2005: "float __cdecl Math::FastSquareRoot(float)" (?FastSquareRoot@Math@@YAMM@Z) already defined in vector4.obj
  1&gt;vector2.obj : error LNK2005: "float __cdecl Math::InverseSquareRoot(float,int)" (?InverseSquareRoot@Math@@YAMMH@Z) already defined in vector4.obj
  1&gt;vector2.obj : error LNK2005: "float __cdecl Math::SquareRoot(float,int)" (?SquareRoot@Math@@YAMMH@Z) already defined in vector4.obj
  1&gt;vector3.obj : error LNK2005: "float __cdecl Math::FastInverseSquareRoot(float)" (?FastInverseSquareRoot@Math@@YAMM@Z) already defined in vector4.obj
  1&gt;vector3.obj : error LNK2005: "float __cdecl Math::FastSquareRoot(float)" (?FastSquareRoot@Math@@YAMM@Z) already defined in vector4.obj
  1&gt;vector3.obj : error LNK2005: "float __cdecl Math::InverseSquareRoot(float,int)" (?InverseSquareRoot@Math@@YAMMH@Z) already defined in vector4.obj
  1&gt;vector3.obj : error LNK2005: "float __cdecl Math::SquareRoot(float,int)" (?SquareRoot@Math@@YAMMH@Z) already defined in vector4.obj
  </code></pre>