【发布时间】: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()
...
这里有两个我不明白的基本问题:
- 当我将
RedundantTypedef用于getTypedefedDataStructure()的返回类型时,我收到编译器错误:“RedundantTypedef”没有命名类型。这个问题可以通过正确使用::范围分辨率来解决。我理解那部分。 - 当我将
typedef std::map<std::string, StructName> RedundantTypedef;移到HeaderTwoClass之外时,我不必在header_one.h中使用相同的typedef,我再次遇到错误。错误:未在此范围内声明“RedundantTypedef”
typedefs 的正确排列应该是什么,所以我不会出错,并且能够将它用作getTypedefedDataStructure() 的返回类型
解决方案:
我发现为什么会出现 case 1 的错误。我将typedef std::map<std::string, StructName> RedundantTypedef; 移动到struct 声明之上,并且由于这个typedef 本身包含struuct StructName,编译器会报告错误。
感谢大家的帮助。我应该保留这个问题,还是应该删除它?
【问题讨论】:
-
.. 请同时引用具体的错误信息
-
...请把它变成真正的MCVE,代码示例的呈现方式非常无用。
-
你是否对
::使用了正确的范围分辨率? -
因为在同一个编译单元中有两个同名的定义?
-
顺便说一句:请不要在问题中自行回答。请改用实际的 answer。 (请记住,当您这样做时,cmets 是暂时的。)