title: Error 'boost::hash_combine': recursive function template definition after Visual Studio 2015 Update 2 installed
body: <p>After my Visual studio 2015 updated from Update 1 to Update 2 my project doesn't compiling. I get an error</p>
  
  <blockquote>
    <p>'boost::hash_combine': recursive function template definition<br>
    boost-1_60\boost\functional\hash\hash_fwd.hpp(25): note: see declaration of 'boost::hash_combine'</p>
  </blockquote>
  
  <p>Why does it happen?<br>
  Removing or moving <code>#include &lt;boost/filesystem.hpp&gt;</code> from <code>stdafx.h</code> solved the problem. But how can I don't move it from there?  </p>
  
  <pre><code>//stdafx.h
  #ifndef STDAFX_H
  #define STDAFX_H
  
  #include &lt;map&gt;
  #include &lt;vector&gt;
  
  #include &lt;boost/archive/binary_iarchive.hpp&gt;
  #include &lt;boost/iostreams/device/back_inserter.hpp&gt;
  #include &lt;boost/iostreams/stream.hpp&gt;
  #include &lt;boost/serialization/map.hpp&gt;
  #include &lt;boost/serialization/vector.hpp&gt;
  
  #include &lt;boost/filesystem.hpp&gt;
  
  #endif
  </code></pre>
  
  <p>-</p>
  
  <pre><code>//main.cpp
  #include "stdafx.h"
  
  class IByteStream
  {
  public:
      explicit IByteStream(const std::string &amp;s)
          : _basicArraySource(s.data(), s.size())
          , _stream(_basicArraySource)
          , _iArchive(_stream)
      {
      }
  
      template&lt;class T&gt;
      IByteStream &amp;operator &gt;&gt; (T &amp;data) { _iArchive &gt;&gt; data; return *this; }
  
  private:
      typedef boost::iostreams::basic_array_source&lt;char&gt; BasicArraySource;
      typedef boost::iostreams::stream&lt;BasicArraySource&gt; Stream;
      typedef boost::archive::binary_iarchive BinaryIArchive;
  
      boost::iostreams::basic_array_source&lt;char&gt; _basicArraySource;
      boost::iostreams::stream&lt;BasicArraySource&gt; _stream;
      boost::archive::binary_iarchive _iArchive;
  };
  
  struct S1
  {
      template&lt;class Archive&gt;
      void serialize(Archive &amp;ar, unsigned) {}
  };
  
  struct S2
  {
      std::map&lt;int, std::map&lt;int, S1&gt;&gt; mp;
  
      template&lt;class Archive&gt;
      void serialize(Archive &amp;ar, unsigned) { ar &amp; mp; }
  };
  
  struct S3
  {
      std::vector&lt;S2&gt; v;
  
      template&lt;class Archive&gt;
      void serialize(Archive &amp;ar, unsigned) { ar &amp; v; }
  };
  
  inline void parse(IByteStream &amp;ibs) {}
  
  template&lt;class T, class... TT&gt;
  void parse(IByteStream &amp;ibs, T &amp;t, TT&amp;... tt)
  {
      ibs &gt;&gt; t;
      parse(ibs, tt...);
  }
  
  int main()
  {
      std::string str;
      IByteStream ibs(str);
      S3 s3;
      parse(ibs, s3);
  }
  </code></pre>
  
  <p><a href="http://s000.tinyupload.com/index.php?file_id=69073313277883963480" rel="nofollow">Test1.zip</a></p>