这些名称冲突如何在C ++中解决?
|
说我有这个物理结构:
/
+-- conflicttest
| +-- A.cpp
| +-- A.h
| +-- main.cpp
+-- libconflict
| +-- conflict
| | +-- A.h
| | +-- B.h
| +-- A.cpp
| +-- B.cpp
这些是libconflict的根源,请深呼吸:
libconflict中的“ 1”标题:
// libconflict B.h
class B
{
public:
void bar();
protected:
int j_;
};
libconflict中的“ 1”实现:
// libconflict B.cpp
#include \"conflict/B.h\"
void B::bar()
{
std::cout << \"B::bar\" << std::endl;
}
libconflict中的“ 5”标题:
// libconflict A.h
# include \"conflict/B.h\"
class A : public B
{
public:
A();
private:
int i_;
};
“ libconflict”中的“ 5”实现:
#include \"conflict/A.h\"
A::A()
{
std::cout << \"libconflict A is alive\" << std::endl;
i_ = 51; // some random fields and values... I should admit I am lost
j_ = 47;
}
现在,冲突测试的来源已经结束:
冲突测试中的“ 5”标题:
// conflicttest A.h
class A
{
public:
A();
void foo();
};
冲突测试中的“ 5”实施:
// conflicttest A.cpp
#include \"A.h\"
A::A()
{
std::cout << \"A is alive\" << std::endl;
}
void A::foo()
{
std::cout << \"A::foo\" << std::endl;
}
最后,main.cpp
:
// main.cpp in conflicttest
#include \"conflict/A.h\"
int main()
{
B* b = new A;
b->bar();
return 0;
}
......我正在使用Visual Studio 2010构建此解决方案。 conflicttest
是与静态库libconflict
链接的可执行文件。
这样编译就像一个咒语,但是,不管您相信与否,输出为:
A is alive
B::bar
链接器实际上使用来自ѭ15的符号A
,这绝对不是ѭ20,更糟的是,它可以调用B::bar()
。
我迷路了,编译器为什么不抱怨?
没有找到相关结果
已邀请:
4 个回复
茂坦湿床够
垫歌蝎降凤
芜任亮蜡
娜拐赐巫潭