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

C++ C++;具有相同名称的多个类,c++,class,scope,C++,Class,Scope,假设我有两个不同的cpp文件。这两个类都使用相同的名称声明类,但可能是完全不同的结构(或者可能是相同的结构,不同的实现)。这些类不会出现在头文件中。(例如,假设它们是不同列表类的节点类。) 我看到过这些课程的冲突。这是标准所期望的吗?这个问题有什么解决办法 更新: 正如回答/评论所建议的,匿名名称空间是我所寻找的。解决此问题的标准方法是将类包装成不同的名称空间。我不确定这里是否缺少一些细节,但您可以将每个类包装成名称空间 namespace A { class Node { }; }

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

我看到过这些课程的冲突。这是标准所期望的吗?这个问题有什么解决办法

更新:


正如回答/评论所建议的,匿名名称空间是我所寻找的。

解决此问题的标准方法是将类包装成不同的名称空间。

我不确定这里是否缺少一些细节,但您可以将每个类包装成
名称空间

namespace A {
    class Node { };
}

namespace B {
    class Node { };
}

然后,您可以使用
A::Node
B::Node

您可以使用名称空间,通过在不同的名称空间中对多个类进行子作用域,使它们具有相同的名称。见:

我看到过这些课程的冲突。这是标准所期望的吗

标准上说你不能这么做。这将违反“一个定义”规则。(其他答案中已经介绍了如何解决此问题)

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

请参见中的示例。我的编译器和链接器(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;
}
//main.cpp
#包括
#包括
使用名称空间std;
结构处理程序
{
Handler():d(10,1.234){}
名单d;
};
外部无效测试_func();
内部主(空)
{
处理程序h;

我的解释可能不正确,但标准不是说在3.2.5
中,一个类类型可以有多个定义。如果每个定义出现在不同的翻译单元中,…满足以下要求…
,因为问题是这些类在它们自己的.cpp文件中,这意味着在(不包括任何预处理器的事情)时,它们处于不同的翻译单元中,因此编译失败,因为没有满足要求,但也可能出现ODR不中断的情况(当所有条件都满足时)。@Lccarrasco:该列表上的第一个要求是“
D的每个定义应包含相同的令牌序列
,这意味着可能只有一个定义。它在多个翻译单元中重复,但只有一个定义。如果翻译单元之间的定义不同,您就违反了规则。@Lccarrasco:基本上就是这样,您可以在头文件中定义类(这是定义类的常用位置)。或者,使用嵌套类:
List::Node
Tree::Node
是非常明显的名称,并且这两个
Node
都不会污染任何其他人的命名空间。您甚至可以使用匿名命名空间。
// 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;
}