我使用import导入一个ocx文件,它生成文件中包含IServiceProvider的定义,而在程序中调用库文件中也有IServiceProvider的定义,这样就出现了重定义问题,那个我都不能改呀,那怎么办?
、用MFC AppWizard(EXE)新建一单文档工程MyNamespace,
所有设置取默认值即可。
2、然后新建两个头文件,文件名分别为class1.h和class2.h,
注意在这两个文件中有3个同名的类CMyClass。
3、编写文件class1.h,其内容为:
// class1.h
namespace MyNamespace1 //名字空间MyNamespace1
{
class CMyClass
{
public:
CMyClass():m_string("namespace1")
{
}
const CString& GetString()
{
return m_string;
}
void SetString(CString newString)
{
m_string = newString;
}
private:
CString m_string;
};
};
namespace MyNamespace3 //名字空间MyNamespace3
{
class CMyClass
{
public:
CMyClass():m_string("namespace3")
{
}
const CString& GetString()
{
return m_string;
}
void SetString(CString newString)
{
m_string = newString;
}
private:
CString m_string;
};
};
4、再编写文件class2.h,其内容如下:
// class2.h
namespace MyNamespace2 //名字空间MyNamespace2
{
class CMyClass
{
public:
CMyClass():m_string("namespace2")
{
}
const CString& GetString()
{
return m_string;
}
void SetString(CString newString)
{
m_string = newString;
}
private:
CString m_string;
};
};
5、将#include "class1.h"
#include "class2.h"
加入到MyNamespaceView.cpp文件中。
6、在void CMyNamespaceView::OnDraw(CDC* pDC)中添加以下代码:
MyNamespace1::CMyClass class1;
MyNamespace2::CMyClass class2;
MyNamespace3::CMyClass class3;
CString text1,text2,text3;
text1 = class1.GetString();
text2 = class2.GetString();
text3 = class3.GetString();
pDC->TextOut(10,10,text1);
pDC->TextOut(10,30,text2);
pDC->TextOut(10,50,text3);
7、编译,运行。看看运行结果如何?
8、几点说明:
一、名字空间解决了C++的名字冲突问题
二、注意名字空间namespace的书写格式,和类class相似或相同。
三、名字空间名必需是唯一的,否则必需在它们的外面再套上一层名字空间,
亦即名字空间可以和类一样的嵌套使用
四、同名类在声明实例时必需加上名字空间作用域符“名字空间名::类名”
五、不一定只有类才可加上名字空间的外套,其它如,局部变量、全局变量
等都可加上名字空间外套。
六、名字空间还有更广泛的作用,有兴趣的朋友可与本人交流,我的EMAIL是
foryijian@sohu.com
七、以后各位看到std::,SHDocVw::应该不会默生了。
#import时使用rename_namespace指令