我知道,这看起来很奇怪,但我的目标是在C ++中取消定义一个类。问题的根源在于结合TinyXML2和Boost单元测试。
正在测试的头文件(Configuration.h)的内容:
...
#include <tinyxml2.h>
...
这是我的configurationTests.h文件的内容:
#include "unitTests.h"
#include "Configuration.h"
BOOST_AUTO_TEST_SUITE(configuration_test)
BOOST_AUTO_TEST_CASE(basic) {
...
}
BOOST_AUTO_TEST_SUITE_END( )
当我尝试编译我的测试时,我收到一个错误:
错误C2371:'XMLDocument':重新定义;不同的基础 类型c:\ program files(x86)\ windows kits \ 8.0 \ include \ um \ msxml.h 10085
在第10085行的这个文件(msxml.h)中,我们有这个类定义:
class DECLSPEC_UUID("CFC399AF-D876-11d0-9C10-00C04FC99C8E")
XMLDocument;
当我删除这两行时,我的测试会编译,一切似乎都很好。当然,这不是一个解决方案,但事实证明,Boost单元测试库中的某些东西包含msxml.h,并且不知何故导致与TinyXML2库发生冲突。
我尝试了在Google中找到的不同解决方案(比如写“#define WIN32_LEAN_AND_MEAN”),删除“使用命名空间tinyxml2”并在tinyxml2.cpp中进行更改 - 实际上没有任何帮助。
所以,我的问题很简单:我可以在编译时以某种棘手的方式取消定义(卸载?)先前定义的类吗?我试过“#undef XMLDocument”,“#define XMLDocument 1”+“#undef XMLDocument” - 没什么用。
更新:实际上,我通过在configurationTests.h的第一行写“#define MSXML_LIBRARY_DEFINED ”来解决问题。但是,我仍然想知道这个主题问题的答案。
答案 0 :(得分:0)
试试这个:
namespace your_name_space
{
#include <tinyxml2.h>
}
从现在起,tinyxml2中的所有类都被命名空间隐藏了。
必须为tinyxml2.cpp文件声明namespece。
答案 1 :(得分:0)
我认为你已经为tinyxml2使用了默认命名空间。
尝试删除using namespace tinyxml2
,然后像在此示例中一样使用它:
tinyxml2::XMLDocument xDoc;