说我有两个不同的cpp文件.两者都声明具有相同名称的类,但可能是完全不同的结构(或者可能是相同的结构,不同的实现).这些类不会出现在头文件中.(例如,假设它们是不同列表类的Node类.)
我看到这些类冲突了.这是标准的预期吗?这个问题有什么解决方案?
更新:
正如答案/评论所暗示的那样,匿名命名空间就是我所寻求的.
它违反了一个定义规则.编译器很难检测到错误,因为它们位于不同的编译单元中.甚至链接器也无法检测到所有错误.
请参阅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.或者您可以在匿名命名空间中添加类.请参见如何仅在一个编译单元中使用的类型违反单一定义规则?
我不确定这里是否缺少一些细节,但是您将每个类都包装在中namespace
。
namespace A {
class Node { };
}
namespace B {
class Node { };
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用A::Node
或B::Node
。