"Typedef redefinition with different types" Clang中关于工作MSVC代码的错误
"Typedef redefinition with different types" error in Clang on working MSVC code
我得到了一些在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
--结束示例]
- QSqlquery prepare()和bindvalue()不工作
- MSVC多行宏编译器错误
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- MSVC将仅移动结构参数解释为指针
- 我似乎无法让 msvc 链接器在 vscode 上正常工作
- C++指向成员的指针的类内初始化会使 MSVC 失败(但 GCC/Clang 工作)
- GCC 和 clang 抛出"no matching function call"但 msvc (cl) 按预期编译和工作
- "Typedef redefinition with different types" Clang中关于工作MSVC代码的错误
- 对于Clang和Codegen的MSVC 2015,我如何让ast dump工作
- 如何使llvm-jit在MSVC++中工作
- QT 5.7 MSVC 2015静态构建不工作
- MSVC - 使用 void_t 进行成员检测无法正常工作
- msvc++说变量周围的堆栈正在损坏,但程序工作