C++ 错误';boost::hash#u combine';:安装Visual Studio 2015 Update 2后的递归函数模板定义
在我的Visual studio 2015从更新1更新到更新2后,我的项目无法编译。我犯了一个错误 'boost::hash_combine':递归函数模板定义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
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);
}