C++ 错误';boost::hash#u combine';:安装Visual Studio 2015 Update 2后的递归函数模板定义

C++ 错误';boost::hash#u combine';:安装Visual Studio 2015 Update 2后的递归函数模板定义,c++,c++11,boost,visual-studio-2015,precompiled-headers,C++,C++11,Boost,Visual Studio 2015,Precompiled Headers,在我的Visual studio 2015从更新1更新到更新2后,我的项目无法编译。我犯了一个错误 'boost::hash_combine':递归函数模板定义 boost-1_60\boost\functional\hash\hash_fwd.hpp(25):注意:参见“boost::hash_combine”的声明 为什么会发生这种情况? 从stdafx.h中删除或移动#include解决了问题。但我怎么能不把它移走呢 //stdafx.h #ifndef STDAFX_H #define

在我的Visual studio 2015从更新1更新到更新2后,我的项目无法编译。我犯了一个错误

'boost::hash_combine':递归函数模板定义
boost-1_60\boost\functional\hash\hash_fwd.hpp(25):注意:参见“boost::hash_combine”的声明

为什么会发生这种情况?
stdafx.h
中删除或移动
#include
解决了问题。但我怎么能不把它移走呢

//stdafx.h
#ifndef STDAFX_H
#define STDAFX_H

#include <map>
#include <vector>

#include <boost/archive/binary_iarchive.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/vector.hpp>

#include <boost/filesystem.hpp>

#endif
//stdafx.h
#ifndef STDAFX_H
#定义STDAFX_H
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#恩迪夫
-

//main.cpp
#包括“stdafx.h”
类IByteStream
{
公众:
显式IByteStream(const std::string&s)
:_基本数据源(s.data(),s.size())
,_溪流(_basicArraySource)
,_iArchive(_stream)
{
}
模板
IByteStream&operator>>(T&data){iArchive>>数据;返回*this;}
私人:
typedef boost::iostreams::basic_array_source BasicArraySource;
typedef boost::iostreams::stream;
typedef boost::archive::binary_iarchive binaryArchive;
boost::iostreams::basic\u array\u source\u basicArraySource;
boost::iostreams::stream\u stream;
boost::archive::binary\u iarchive\u iarchive;
};
结构S1
{
模板
void序列化(存档&ar,未签名){}
};
结构S2
{
std::map-mp;
模板
void序列化(存档&ar,未签名){ar&mp;}
};
结构S3
{
std::向量v;
模板
无效序列化(存档&ar,未签名){ar&v;}
};
内联void解析(IByteStream&ibs){}
模板
void解析(IByteStream&ibs、T&T、TT&…TT)
{
ibs>>t;
解析(ibs,tt…);
}
int main()
{
std::字符串str;
ibs(str);
S3;
parse(ibs,s3);
}

你能做这项工作来生产一个新的产品吗?我怀疑上面的每一行都是产生这个错误所必需的。@yakk如果删除某个东西,那么错误就不会发生。如果您删除
ar&mp
中序列化
结构S2中
它不会产生错误吗?如果将预编译头移动到
main.cpp
中,是否不会产生错误?如果您使用
IByteStream::operator>
只需
返回*this错误消失?@yakk错误在所有三种情况下都消失
//main.cpp
#include "stdafx.h"

class IByteStream
{
public:
    explicit IByteStream(const std::string &s)
        : _basicArraySource(s.data(), s.size())
        , _stream(_basicArraySource)
        , _iArchive(_stream)
    {
    }

    template<class T>
    IByteStream &operator >> (T &data) { _iArchive >> data; return *this; }

private:
    typedef boost::iostreams::basic_array_source<char> BasicArraySource;
    typedef boost::iostreams::stream<BasicArraySource> Stream;
    typedef boost::archive::binary_iarchive BinaryIArchive;

    boost::iostreams::basic_array_source<char> _basicArraySource;
    boost::iostreams::stream<BasicArraySource> _stream;
    boost::archive::binary_iarchive _iArchive;
};

struct S1
{
    template<class Archive>
    void serialize(Archive &ar, unsigned) {}
};

struct S2
{
    std::map<int, std::map<int, S1>> mp;

    template<class Archive>
    void serialize(Archive &ar, unsigned) { ar & mp; }
};

struct S3
{
    std::vector<S2> v;

    template<class Archive>
    void serialize(Archive &ar, unsigned) { ar & v; }
};

inline void parse(IByteStream &ibs) {}

template<class T, class... TT>
void parse(IByteStream &ibs, T &t, TT&... tt)
{
    ibs >> t;
    parse(ibs, tt...);
}

int main()
{
    std::string str;
    IByteStream ibs(str);
    S3 s3;
    parse(ibs, s3);
}