C++ 多个具有相同名称的类

Posted

技术标签:

【中文标题】C++ 多个具有相同名称的类【英文标题】:C++ Multiple classes with same name 【发布时间】:2011-09-16 18:57:40 【问题描述】:

假设我有两个不同的 cpp 文件。两者都声明了具有相同名称的类,但可能是完全不同的结构(或者可能是相同的结构,不同的实现)。这些类不会出现在头文件中。 (例如,假设它们是不同列表类的 Node 类。)

我已经看到这些类发生冲突。这是标准所期望的吗?这个问题有什么解决办法?

更新:

正如 answers/cmets 所建议的,匿名命名空间是我正在寻找的。​​p>

【问题讨论】:

【参考方案1】:

解决此问题的标准方法是将类包装在不同的namespaces 中。

【讨论】:

或者,使用嵌套类:List<T>::NodeTree<T>::Node 是非常明显的名称,Node 都不会污染其他人的命名空间。 你甚至可以使用匿名命名空间。【参考方案2】:

我不确定我是否在这里遗漏了一些细节,但是您将每个类都包装在 namespace 中。

namespace A 
    class Node  ;


namespace B 
    class Node  ;

那么你可以使用A::NodeB::Node

【讨论】:

【参考方案3】:

您可以使用命名空间来拥有多个具有相同名称的类,方法是将它们划分为不同的命名空间。见:http://www.cplusplus.com/doc/tutorial/namespaces/

【讨论】:

【参考方案4】:

我已经看到这些类发生冲突。这是标准所期望的吗?

标准规定您不能这样做。这将违反单一定义规则。 (如何解决这个问题已经在其他答案中介绍过)

【讨论】:

我可能解释不正确,但标准没有在 3.2.5 There can be more than one definition of a class type.. provided that each definition appears in a different translation unit, ...satisfy the following requirements... 说,因为问题说这些类在他们自己的 .cpp 文件中这意味着(除非有任何预处理器)它们 在不同的翻译单元中,因此编译失败是因为不满足要求,但也可能存在没有破坏 ODR 的情况(当所有条件都满足时)。 @Lccarrasco:该列表中的第一个要求是“each definition of D shall consist of the same sequence of tokens”,这意味着可能只有一个定义。它在多个翻译单元中重复,但只有一个定义。如果翻译单元之间存在差异,则您违反了规则。 @Lccarrasco:基本上就是这样,您可以在头文件中定义一个类(无论如何,这是定义类的常用位置)。【参考方案5】:

它违反了One Definition Rule。编译器很难检测到错误,因为它们位于不同的编译单元中。甚至链接器也无法检测到所有错误。

参见http://www.cplusplus.com/forum/general/32010/ 中的示例。我的编译器和链接器(g++ 4.2.1)可以构建最终的可执行文件而没有任何错误,但是输出错误。

如果我稍微改变一下示例,就会出现分段错误。

// main.cpp
#include <iostream>
#include <list>
using namespace std;

struct Handler

    Handler() : d(10, 1.234) 
    list<double> d;
;

extern void test_func();

int main(void)

    Handler h;
    cout << h.d.back() << endl;
    test_func();
    return 0;

// test.cpp
#include <iostream>
#include <string>
using namespace std;

struct Handler

    Handler() : d("test Handler")  
    string d;
;

void test_func()

    Handler h;
    cout << h.d << endl;

建议按命名空间区分您的类。例如Node,您可以使用嵌套类并在父列表类中定义Node。或者您可以在匿名命名空间中添加您的类。见How can a type that is used only in one compilation unit, violate the One Definition Rule?

【讨论】:

以上是关于C++ 多个具有相同名称的类的主要内容,如果未能解决你的问题,请参考以下文章

使用 Castle ActiveRecord,当两个类名称相同但名称空间不同时,我会收到 NHibernate DuplicateMappingException

创建多个具有相同名称的类对象? C++

Java知识合集

如果有多个具有相同类名且没有资源 ID 的元素,如何检查元素

Jquery:如何从具有相同类名的多个 iframe 加载特定 iframe

我如何通过 className 单击此元素,因为我将它用于具有相同类名的多个屏幕