【问题标题】:Wrong name resolution when parent and inner class have the same name父类和内部类同名时名称解析错误
【发布时间】:2012-08-14 03:02:58
【问题描述】:

我对 Visual Studio 2003 有一个奇怪的情况。出于某种合理的原因,我有以下层次结构:

class A {};

class B : public A {
public:
    class A {};
};

class C : public B::A {};

也就是说,我有一个与外部类的父级同名的内部类。当C 尝试从B::A 继承时,Visual Studio 认为我指向的是父类A,而不是B 中的嵌套类。 GCC 似乎像我预期的那样解析为内部类版本

这是 Visual Studio 2003 的错误,还是我做错了?是否有解决方法(除了升级 Visual Studio)?

【问题讨论】:

  • Visual C++ 2003 于九年前发布。出于多种原因,建议升级。
  • @JamesMcNellis 如果我负责这些事情,我们早就升级了,但遗憾的是我没有

标签: c++ visual-studio-2003 class-hierarchy token-name-resolution


【解决方案1】:

这看起来像是 Visual C++ 2003 中的一个错误。使用 Visual C++ 2012,B::A 正确命名嵌套类 A,而不是基类 A

【讨论】:

  • 至于解决方法,我不知道:设计相当有问题。我会重命名嵌套类。如果我安装了 Visual C++ 2003,我会尝试看看发生了什么,但我已经有几年没有使用 Visual C++ 2003了。
  • 我很愚蠢,没有测试我的简化示例;事实证明这是错误的。更新的重现问题
【解决方案2】:

它看起来像一个 VS 错误,
我不知道 感谢您的发帖。
我认为解决方法将是一个 SafeInherit 模板我不知道什么是更好的名称。

template <typename T>
struct SafeInherit{
  typedef T Type;
};

class B : public SafeInherit<A>::Type {
  public:
  class A {};
}

【讨论】:

    【解决方案3】:

    是的,这看起来像 VS2003 错误。解决方法很简单 - 使用 typedef,它是这样工作的:

    class A { public: int x; };
    class B : public A { public: class A { public: int y; }; }; 
    
    typedef B::A BA;
    
    class C: public BA {};
    
    void f()
    {
       C cc;
       cc.y = 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多