我认为,描述有点棘手。但我尽我所能......
假设:
编程(Prog_A)
一个lib(Lib_A) 一个Class_A
类还有一个lib(Lib_B),它(也)有一个Class_A类,并且有一个成员Class_A mClass_A
Class_A这两个类都有函数
void Class_A::DoSome(){
...
}
对于Lib_A中的Class_A,然后
void Class_A::DoSome(){
std::cout << "LIB_A";
}
对于Lib_B中的Class_A
void Class_A::DoSome(){
std::cout << "LIB_B";
}
Prog_A包括Lib_A,Lib_A包括Lib_B。 Lib_A和Lib_B由Callback“连接”。 如果我现在在 Lib_B 中调用mClass_A.DoSome(),那么它正在打印
LIB_A
而不是我的期望'LIB_B'。
这种行为是否正确,还是我必须担心?
答案 0 :(得分:4)
你的代码错了。您已定义Class_A
两次,且定义不匹配。
不允许。
[C++11: 3.2/3]
:每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断。该定义可以在程序中明确显示,可以在标准或用户定义的库中找到,或者(在适当的时候)隐式定义(见12.1,12.4和12.8)。内联函数应在每个使用它的翻译单元中定义。
[C++11: 3.2/5]
:可以有多个类类型的定义(第9条),枚举类型(7.2),带外部链接的内联函数(7.1.2),类模板(第14章),非静态函数模板(14.5.6),类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或模板特化为其中的一些模板参数未在程序中指定(14.7,14.5.5),前提是每个定义出现在不同的翻译单元中,并且定义满足以下要求。鉴于这样一个名为D`的实体在多个翻译单元中定义,那么
D
的每个定义都应包含相同的令牌序列;- [..]
如果您直接构建整个程序,则会在链接时出现多个定义错误;但是,由于你是动态链接,这是不可能的,你的程序就会被破坏。
使用命名空间将定义彼此分开。
在共享库中使用a custom boost::lexical_cast
specialisation I'd found on Stack Overflow时,我设法偶然导致此问题一次,而没有意识到原始的“默认”专门化已在单独的共享库中实例化。我从主应用程序中获得的行为非常难以预测。