C++ C+应使用哪个类+;?

C++ C+应使用哪个类+;?,c++,class,C++,Class,我认为,描述有点棘手。但是我尽我最大的努力 鉴于: A项目(项目A) 带有 班级 还有一个lib(lib_B),它有一个class,还有一个成员class,mcclass 两个类Class_A都具有此功能 void Class_A::DoSome(){ ... } 对于Lib_A中的A类 void Class_A::DoSome(){ std::cout << "LIB_A"; } void类_A::DoSome(){ std::cout您的代码错误。您已经定义了两次Class\

我认为,描述有点棘手。但是我尽我最大的努力

鉴于:

A项目(项目A)

带有 班级

还有一个lib(lib_B),它有一个class,还有一个成员class,mcclass

两个类Class_A都具有此功能

void Class_A::DoSome(){
...
}
对于Lib_A中的A类

void Class_A::DoSome(){
std::cout << "LIB_A";
}
void类_A::DoSome(){

std::cout您的代码错误。您已经定义了两次
Class\u A
,但定义不匹配

这是不允许的

[C++11:3.2/3]
每个程序应包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断。该定义可以明确显示在程序中,可以在标准或用户定义库中找到,或者(如果适用)它是隐式定义的(见12.1、12.4和12.8)。应在使用odr的每个翻译单元中定义内联函数

[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
    的定义应包含相同的令牌序列
  • [……]
如果您直接构建整个程序,那么在链接时会出现多个定义错误;但是,由于您是动态链接的,因此这是不可能的,并且您的程序只是被破坏了

使用名称空间将定义彼此分离


有一次我在共享库中使用时意外地导致了这个问题,但我没有意识到原来的“默认”专业化已在一个单独的共享库中实例化。我从主应用程序获得的行为非常不可预测。

您的代码是错误的。您已经定义了两次
Class\u a
,但定义不匹配

这是不允许的

[C++11:3.2/3]
每个程序应包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断。该定义可以明确显示在程序中,可以在标准或用户定义库中找到,或者(如果适用)它是隐式定义的(见12.1、12.4和12.8)。应在使用odr的每个翻译单元中定义内联函数

[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
    的定义应包含相同的令牌序列
  • [……]
如果您直接构建整个程序,那么在链接时会出现多个定义错误;但是,由于您是动态链接的,因此这是不可能的,并且您的程序只是被破坏了

使用名称空间将定义彼此分离


有一次我在共享库中使用时意外地导致了这个问题,但我没有意识到原来的“默认”专门化在一个单独的共享库中进行了实例化。我从主应用程序中得到的行为是不可预测的。

了解更多关于
虚拟
成员函数的信息&linux真的与这个问题有关吗?使名称不同,或者使用名称空间使使用更清晰。这有更多的问题需要解决与.ELF可执行格式相比,Linux本身使用。为此,C++使用所谓的“弱符号”。进程映像中的时间。每个库都可以定义相同名称的符号,但第一个库获胜。PS:这不是您问题的答案。关于名称损坏和符号映射到.ELF格式的真实答案将非常长。@BasileStrynkevitch此问题与虚拟成员函数和vtables无关。这是一个不明确的命名问题在上面描述的场景中,没有弱符号。弱符号用于内联函数和倍体,但不是C++中的每个符号。也许你在想ELF符号的位置,这是独立于弱符号的。了解更多关于<代码>虚拟< /代码>成员函数。Linux真的有任何薄吗?G要处理这个问题吗?让名字不同或者使用名称空间来让事情变得更清晰。这与EL可执行文件格式有关,而不是Linux本身。为此,C++使用所谓的“弱符号”。这些可以呈现“多个”。进程映像中的时间。每个库都可以定义相同名称的符号,但第一个库获胜。PS:这不是您问题的答案。关于名称损坏和符号映射到.ELF格式的真实答案将非常长。@BasileStryneVitch此问题与虚拟成员函数和vtables无关。它是一个
void Class_A::DoSome(){
std::cout << "LIB_B";
}