"Typedef redefinition with different types" Clang中关于工作MSVC代码的错误

"Typedef redefinition with different types" error in Clang on working MSVC code

本文关键字:工作 MSVC 错误 代码 with redefinition Typedef different types Clang 于工作      更新时间:2023-10-16

我得到了一些在MSVC上编译良好的代码,我正试图让它在Xcode中的Clang上编译。我目前遇到一个问题,使用以下typedef:重新定义类

typedef std::map<MyNS::istring, EntityState> Entity;

查看经过预处理的输出,我可以看到在这个typedef之前有两个class Entity的前向声明。然而,class Entity的实际定义不在预处理的输出中,但它与新的实体映射在同一个命名空间中(虽然不是MyNS…)。是正向声明导致了这个错误吗?这在MSVC中是否有效,而由于Clang的迂腐而不起作用?

编辑:我手头没有MSVC,但这里有一个片段,我把它放在一起,以演示我遇到的错误(我简化了定义,使其适合在一个小空间内)。这导致了与我尝试使用Clang编译它时相同的错误。这在微软风投公司可行吗?

namespace TheNS {
class Entity;
struct EntityState
{
std::string aString, anotherString;
int anInt;
EntityState() {}
EntityState(std::string a, std::string b, int i)
{
// constructor
}
};
typedef std::map<std::string, EntityState> Entity;
class Entity
{
public:
void SomeFunction();
private:
int m_aVar;
};
}    

是的,这是不正确的。不应该编译,如果它在MSVC上编译——可能是编译器的错误。正向声明告诉编译器,TheNS::Entity将是类,而不是其他(不是enum、union或typedef)。真的,你的代码和是一样的

class Entity;   
typedef int Entity;

当然这是不正确的。

n3337 9.1/2

仅由类密钥标识符组成的声明;是对名称的重新声明在当前作用域中,或者将标识符的前向声明作为类名。它介绍了类名进入当前范围

所以,在这次之后

class Entity;

compiles知道Entity将被用作类名。这个名称可以重新声明为函数(在同一范围内),在这种情况下,当您想要使用Entity类时,您应该使用class Entity(或者如注释中所述,通过typedef重新声明Entity名称)。

7.1.3/6

在给定的作用域中,typedef说明符不应用于重新定义在中声明的任何类型的名称范围以引用不同的类型。[示例:

class complex { /∗ ... ∗/ };
typedef int complex; // error: redifinition

--结束示例]