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

时间:2011-06-16 22:38:08

标签: c++ class scope

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

我看到这些类冲突了。这是标准的预期吗?这个问题有什么解决方案?

更新:

正如答案/评论所暗示的那样,匿名名称空间是我一直在寻找的。

5 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:9)

违反了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,您可以使用nest类并在父列表类中定义Node。或者您可以在匿名命名空间中添加类。见How can a type that is used only in one compilation unit, violate the One Definition Rule?

答案 2 :(得分:6)

通过在不同的命名空间中对它们进行子范围设定,可以使用命名空间来拥有多个具有相同名称的类。请参阅:http://www.cplusplus.com/doc/tutorial/namespaces/

答案 3 :(得分:4)

我不确定我是否在这里遗漏了一些细节,但你将每个班级都包裹在namespace中。

namespace A {
    class Node { };
}

namespace B {
    class Node { };
}

然后您可以使用A::NodeB::Node

答案 4 :(得分:3)

  

我看到这些类冲突了。这是标准的预期吗?

标准说你做不到。它会违反一个定义规则。 (如何解决这个问题已经在其他答案中得到了解释)