gpt4 book ai didi

c++ - 如果 Visual Studio 2012 抛出 VS2012 不应存在的编译错误,这意味着什么?

转载 作者:可可西里 更新时间:2023-11-01 17:56:55 26 4
gpt4 key购买 nike

当我编译一些使用 boost 序列化的类时,出现编译错误 C2996,请参阅下面的消息本身。如果我查找此错误,似乎此错误仅由更旧版本的编译器引发。怎么会这样?

错误信息:

E:\Lib\boost_1_54_0\boost/serialization/split_member.hpp(42): error C2996: 'boost::hash_combine' : recursive function template definition

VS2013、VS2012 以及 VS2012 Update 4 显示了此行为。

最佳答案

我遇到了类似的问题。在我看来,这就像 VS2012(及更高版本)中的错误。我已经能够在一个简单的 .cpp 文件中重现它,所以我打开了一个 connect ticket。 .

我认为当满足以下所有条件时会错误地报告此错误:

  1. 在 *.cpp 文件中某处使用 Boost Serialization 对对象进行反序列化
  2. 序列化对象“足够深”(~5 级 - 即 A 包含 B 的 vector ,B 包含 C 的 vector ,等等,直到 E)。
  3. 在同一个 *.cpp 文件的某处(不一定在同一个函数中),调用了一些模板函数。

如果将对象更改为更“浅”,或者如果删除了对模板化函数的调用,则不再报告该错误。

此外,此错误不会在 VS2010 中重现。我测试了 Boost 版本 1.49、1.52、1.55。

可能的解决方法:在一种情况下,错误仅在我们使用 boost::serialization::object_serializable(而不是默认的 object_class_info)时出现。因此,改回 object_class_info 可能是一种解决方法,但它会破坏与先前序列化数据的向后兼容性。

可能的解决方法 #2:在单独的翻译单元中隐藏模板化函数调用。

以下代码重现了错误:

/*
Download Boost from boost.org and extract into "boost_1_55_0".
Open VS2010 command prompt and build using the following command. It will build sucessfully.
cl BugC2996.cpp /c /EHsc /MD /I"boost_1_55_0"

Open VS2012 command prompt and build using the same command. It will fail with error C2996 on the line that calls UnrelatedTemplateFunc.
If you add EITHER of the following definitions to the command line, it will build successfully on VS2012:
/D "DONT_CALL_FUNC"
/D "SER_CLASS=B"

So it has something to do with the depth of the serialization, plus calling an unrelated templated function.

Please only compile, don't try to link - it will naturally fail.
*/

#pragma warning(disable:4267) // 'var' : conversion from 'size_t' to 'type', possible loss of data (problem in Boost, unrelated to the bug in question)

#include <fstream>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/version.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/shared_ptr_132.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/utility.hpp>

struct E
{
int x;
};

struct D
{
std::vector<E> children;
};

struct C
{
std::vector<D> children;
};

struct B
{
std::vector<C> children;
};

struct A
{
std::vector<B> children;
};


template<class Archive>
void serialize(Archive & ar, A& obj, const unsigned int /*file_version*/)
{
ar & BOOST_SERIALIZATION_NVP(obj.children);
}

template<class Archive>
void serialize(Archive & ar, B& obj, const unsigned int /*file_version*/)
{
ar & BOOST_SERIALIZATION_NVP(obj.children);
}

template<class Archive>
void serialize(Archive & ar, C& obj, const unsigned int /*file_version*/)
{
ar & BOOST_SERIALIZATION_NVP(obj.children);
}

template<class Archive>
void serialize(Archive & ar, D& obj, const unsigned int /*file_version*/)
{
ar & BOOST_SERIALIZATION_NVP(obj.children);
}

template<class Archive>
void serialize(Archive & ar, E& obj, const unsigned int /*file_version*/)
{
ar & BOOST_SERIALIZATION_NVP(obj.x);
}



template<class T>
boost::shared_ptr<T> UnrelatedTemplateFunc(const std::string & argument);


#ifndef SER_CLASS
#define SER_CLASS A
#endif

// serialize A and the build will fail (if UnrelatedTemplateFunc is called below)
// serialize B instead of A and the build will succeed!
void Func(boost::shared_ptr<SER_CLASS> obj)
{
std::ifstream ifs;
boost::archive::binary_iarchive ia(ifs);
ia >> obj;
}

void OtherFunc()
{
// comment this line and the build will succeed, whatever struct you decide to serialize above
#ifndef DONT_CALL_FUNC
UnrelatedTemplateFunc<unsigned char>("");
#endif
}

关于c++ - 如果 Visual Studio 2012 抛出 VS2012 不应存在的编译错误,这意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21139528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com