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

Tho*_*ing 15 c++ scope class

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

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

更新:

正如答案/评论所暗示的那样,匿名命名空间就是我所寻求的.

Wil*_*l A 21

解决此问题的标准方法是将类包装在不同的命名空间中.

  • 或者,使用嵌套类:`List <T> :: Node`和`Tree <T> :: Node`是非常明显的名称,并且`Node`都不会污染任何其他人的名称空间. (4认同)
  • 您甚至可以使用匿名命名空间. (4认同)

Ian*_*ang 9

它违反了一个定义规则.编译器很难检测到错误,因为它们位于不同的编译单元中.甚至链接器也无法检测到所有错误.

请参阅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;
}
Run Code Online (Sandbox Code Playgroud)
// 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;
}
Run Code Online (Sandbox Code Playgroud)

建议按名称空间区分您的类.例如Node,您可以使用nest类并在父列表类中定义Node.或者您可以在匿名命名空间中添加类.请参见如何仅在一个编译单元中使用的类型违反单一定义规则?


小智 6

您可以使用命名空间通过在不同的命名空间中对它们进 请参阅:http://www.cplusplus.com/doc/tutorial/namespaces/


ali*_*ray 5

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

namespace A {
    class Node { };
}

namespace B {
    class Node { };
}
Run Code Online (Sandbox Code Playgroud)

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