【问题标题】:How to avoid typedef redundancy in two different header files?如何避免两个不同头文件中的 typedef 冗余?
【发布时间】:2015-01-25 00:15:49
【问题描述】:

我试图理解并使用其他人编写的代码,但由于我对typedef 的经验很少,所以我有时会感到困惑。

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

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

header_one.h:

#include "header_two.h"
....

typedef std::map<std::string, StructName> RedundantTypedef;
....

class HeaderOneClass....

header_two.h:

....
struct StructName...
class HeaderTwoClass
{
public:
typedef std::map<std::string, StructName> RedundantTypedef;

std::map<std::string, StructName> getTypedefedDataStructure()
...

这里有两个我不明白的基本问题:

  1. 当我将RedundantTypedef 用于getTypedefedDataStructure() 的返回类型时,我收到编译器错误:“RedundantTypedef”没有命名类型。这个问题可以通过正确使用:: 范围分辨率来解决。我理解那部分。
  2. 当我将typedef std::map&lt;std::string, StructName&gt; RedundantTypedef; 移到HeaderTwoClass 之外时,我不必在header_one.h 中使用相同的typedef,我再次遇到错误。错误:未在此范围内声明“RedundantTypedef”

typedefs 的正确排列应该是什么,所以我不会出错,并且能够将它用作getTypedefedDataStructure() 的返回类型

解决方案:

我发现为什么会出现 case 1 的错误。我将typedef std::map&lt;std::string, StructName&gt; RedundantTypedef; 移动到struct 声明之上,并且由于这个typedef 本身包含struuct StructName,编译器会报告错误。

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

【问题讨论】:

  • .. 请同时引用具体的错误信息
  • ...请把它变成真正的MCVE,代码示例的呈现方式非常无用。
  • 你是否对::使用了正确的范围分辨率?
  • 因为在同一个编译单元中有两个同名的定义?
  • 顺便说一句:请不要在问题中自行回答。请改用实际的 answer。 (请记住,当您这样做时,cmets 是暂时的。)

标签: c++ c++11 typedef


【解决方案1】:

避免名称冲突的最简单方法是在标题页范围内创建命名空间。这是我必须为决赛创建的杂货店数据库示例。

// 文件: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() 函数,这些函数在类中获取它们的特定私有数据。我只需要更改对应类的命名空间的命名空间,该命名空间是杂货店。

使用命名空间是非常必要的,因为大型程序被分成多个团队,并且在这些团队中存在诸如“数据”、“文件”之类的通用名称,或者会相互冲突的非唯一名称。通过使用命名空间,它可以防止冲突,让生活变得非常简单。

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 2011-01-31
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多