Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++ 如何避免两个不同头文件中的typedef冗余?_C++_C++11_Typedef - Fatal编程技术网

C++ 如何避免两个不同头文件中的typedef冗余?

C++ 如何避免两个不同头文件中的typedef冗余?,c++,c++11,typedef,C++,C++11,Typedef,我试图理解并使用其他人编写的代码,但由于我对typedef几乎没有经验,我在某些方面感到困惑 有两个不同的头文件,一个继承另一个,并且在两个文件上声明了相同的typedef 为什么会出现这种冗余,以及如何避免它 标题1.h: 标题2.h: 这里有两个基本问题我不理解: 当我对getTypedefedDataStructure的返回类型使用RedundantTypedef时,我得到一个编译器错误:“RedundantTypedef”没有命名类型。这个问题可以通过正确使用::scope解析来解决。我

我试图理解并使用其他人编写的代码,但由于我对typedef几乎没有经验,我在某些方面感到困惑

有两个不同的头文件,一个继承另一个,并且在两个文件上声明了相同的typedef

为什么会出现这种冗余,以及如何避免它

标题1.h:

标题2.h:

这里有两个基本问题我不理解:

当我对getTypedefedDataStructure的返回类型使用RedundantTypedef时,我得到一个编译器错误:“RedundantTypedef”没有命名类型。这个问题可以通过正确使用::scope解析来解决。我理解这一部分。 当我移动typedef std::map RedundantTypedef;在headertwo类之外,因此我不必在header_one中使用相同的typedef。h我再次遇到错误。错误:“RedundantTypedef”未在此作用域中声明 TypeDef的正确排列应该是什么,这样我就不会出错,并且能够将其用作getTypedefedDataStructure的返回类型

解决方案:

我找到了案例1出现错误的原因。我正在移动typedef std::map RedundantTypedef;在struct声明上方,由于此typedef本身包含struct StructName,编译器将报告错误


谢谢大家的帮助。我应该保留这个问题还是删除它?

避免名称冲突的最简单方法是在标题页的范围内创建名称空间。这里是一个杂货店数据库的例子,我必须为最终的结果创建一个数据库

//文件:store.h //储存购买的物品

#ifndef STOREITEM_H
#define STOREITEM_H

#include "getItem.h"

namespace groceryStore
{
class StoreItem
{
    public:
        StoreItem();
        StoreItem(Buying product, int quantity);
        Buying getId() const;
        int getQuantity() const;
        double getTotal() const;
        void increaseQuantity();
        bool operator == (StoreItem & o);
    private:
        int quantity;
        Buying product;
    };
}

#endif
我有5个使用dArray的类,它可以存储、计算、获取、存储等。每个.h文件或类文件都有自己的名称空间,可以通过::操作符访问,例如

// PRE: Must be called
// POST: Will return the id
groceryStore::Buying groceryStore::StoreItem::getId() const
{
    return product; // change to id
}
上面是一个获取产品ID的函数。通过让每个类都有自己的名称空间,我可以在整个程序中使用多个getID函数来获取类中特定的私有数据。我需要更改的只是名称空间,它与相应类的名称空间相对应


使用名称空间是非常必要的,因为一个大型程序被分成多个团队,在这些团队中有一些通用名称,如数据、文件或非唯一名称,它们会相互冲突。通过使用名称空间,它可以防止冲突,从而使生活变得非常简单

。。请引用具体的错误消息以及。。。请让它成为现实,代码示例的呈现方式是非常无用的。您是否使用正确的范围解析:?因为在同一个编译单元中有两个相同名称的定义?顺便说一句:请不要在问题中自行回答。用实际的答案代替。记住,当你这样做的时候,评论是暂时的。
#ifndef STOREITEM_H
#define STOREITEM_H

#include "getItem.h"

namespace groceryStore
{
class StoreItem
{
    public:
        StoreItem();
        StoreItem(Buying product, int quantity);
        Buying getId() const;
        int getQuantity() const;
        double getTotal() const;
        void increaseQuantity();
        bool operator == (StoreItem & o);
    private:
        int quantity;
        Buying product;
    };
}

#endif
// PRE: Must be called
// POST: Will return the id
groceryStore::Buying groceryStore::StoreItem::getId() const
{
    return product; // change to id
}