Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类名冲突_C++_C_Class_Stl - Fatal编程技术网

C++ C++;类名冲突

C++ C++;类名冲突,c++,c,class,stl,C++,C,Class,Stl,我现在正在做一个需要整合两个子项目的项目 项目A是用C++编写的,项目B是用C编写的。一个问题是,在项目B中,有一个结构,名为矢量>代码>,作者在项目A中使用了 STD::vector < /COD> STL。因为项目B以后可能会更新,所以我不想更改B的向量类的名称 有没有办法处理这样的情况? < P>这就是你为什么有C++的原因!建议将自己的vector类封装在自己的命名空间中。它们已经分别是不同的名称,vector和std::vector。你不必改变任何东西。 < P>如果你合并了2个这样

我现在正在做一个需要整合两个子项目的项目

项目A是用C++编写的,项目B是用C编写的。一个问题是,在项目B中,有一个结构,名为矢量>代码>,作者在项目A中使用了<代码> STD::vector < /COD> <代码> STL</代码>。因为项目B以后可能会更新,所以我不想更改B的向量类的名称


有没有办法处理这样的情况?

< P>这就是你为什么有C++的原因!建议将自己的
vector
类封装在自己的命名空间中。

它们已经分别是不同的名称,
vector
std::vector
。你不必改变任何东西。

< P>如果你合并了2个这样的项目,你当然是C++编程……/P> 您可以将C向量包装在命名空间中。。。每当需要使用C向量时,就将其类型称为C_NAMESPACE::vector。(不要同时导入两个名称空间!)


试试看它是否有效

在我看来,有两个非常简单的解决方案

  • 不要使用名称空间标准
    并将标准库的向量称为
    std::vector
    ,将C向量称为
    vector
    ::vector
  • (如果坚持用
    std
    的内容污染项目的名称空间),请将标准库的向量称为
    vector
    std::vector
    ,将C向量称为
    ::vector
  • 如果您还不知道,在任何名称空间之外声明的任何标识符
    x
    都可以称为
    ::x
    ,它始终不同于在名称空间内部声明的任何标识符
    x


    在这种情况下,我倾向于避免在任何地方编写
    vector
    ,以避免混淆。我总是将标准库的向量称为
    std::vector
    ,将C向量称为
    ::vector
    。如果你这样做了,即使你是
    使用namespace std也没有关系或否。

    谢谢。但我也想问一下,如果在项目A中,我们使用名称空间std编写
    vector
    而不是
    std::vector
    。在这种情况下会有编译错误吗?是的,但ADL可能很容易反驳你。@Chitanda从不使用命名空间std编写
    @Chitanda,您可能正在寻找的答案是类型别名(
    在C++11中使用…=…
    ,或者如果需要,只使用一个普通的
    typedef
    ,以及全局名称空间
    ::vector
    std::vector
    ),但真正的答案是,请仔细想想您编写的这些乱七八糟的东西有多必要。您真的需要一个结构来拥有一个众所周知的C++标准类的名称,并且您真的需要每次导入整个代码> STD< /COD>命名空间吗?@是的,包含命名空间总是好的。然而,省略它们有时确实会使代码更清晰、更容易理解。在C项目中如何拥有一个“名为
    vector
    ”的类?C中没有类。@拟人抱歉,我弄错了。它应该是一个结构。我已经修改了,还有一条评论。目前,我试图将
    c
    项目(项目B)编译成一个库,并调用项目a中的函数。请注意,c中没有名称空间,但c中也没有类,这使得OP的问题非常混乱。因此
    c_NAMESPACE::vector
    只是文本本身,对吗?或者
    C_NAMESPACE
    指的是其他东西?它没有任何意义,只是一个随机标识符。。。用“namespace MyNameSpace{”…C code….“}”包装您的C代码,并将C向量称为MyNameSpace::vector。(或::vector)甚至更好,
    namespace ProjectB{extern“C{#include}}