【发布时间】:2012-10-02 09:37:09
【问题描述】:
我得到了一些在 MSVC 上编译良好的代码,我正试图让它在 Xcode 中的 Clang 上编译。我目前遇到了使用以下 typedef 重新定义类的问题:
typedef std::map<MyNS::istring, EntityState> Entity;
查看预处理后的输出,可以看到在这个typedef之前有两个class Entity的前向声明。但是,class Entity 的实际定义不在预处理输出中,而是在与新实体映射相同的命名空间中(虽然不是 MyNS...)。是导致此错误的前向声明吗?有没有什么方法可以使这在 MSVC 中有效并且由于 Clang 的迂腐而无法工作?
编辑:我手头没有 MSVC,但我整理了一个 sn-p 来演示我遇到的错误类型(我已经简化了定义,以便它们都适合一个小空间) .当我尝试使用 Clang 编译它时,这会导致相同的错误。这可以在 MSVC 中使用吗?
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;
};
}
【问题讨论】:
-
有命名空间,里面有实体类的前向声明和std::map上同名的typedef,是吗?
-
在包含的文件之一中有
class Entity的前向声明,并且在与 typedef 相同的命名空间中存在class Entity的类定义,但在包含的文件之一中没有(即未显示在预处理输出中)。 -
为什么不发布
Entity的所有声明(以及声明出现的命名空间)?如果您发布的 sn-p 可以用 clang 编译以产生您所看到的错误(理想情况下在 MSVC 上没有错误),那就更好了。我很难理解问题中的描述。 -
前向声明与 typedef 在同一个命名空间中?请给他们看。
-
你的意思是:ideone.com/ganOc?
标签: c++ xcode4 scope clang typedef