3

我正在寻找解释为什么以下代码无法在 Windows 上编译:

class TypeA {};

class TypeBInterface
{
public:
    ~TypeBInterface() {}
    virtual TypeA& TypeA() = 0;
};

class TypeB : public TypeBInterface
{
public:
    TypeA& TypeA() { return mTypeA; }
private:
    TypeA mTypeA;
};

TypeA返回类型和方法名之间存在某种命名冲突TypeA。以下返回类型可以正常工作:

::TypeA& TypeA() { return mTypeA; }

我不明白导致这种行为的 C++ 规则。我能得到一个简单的解释吗?


编辑: @BalogPal 请求更多上下文。我正在使用方法链接来构建地图对象。为了添加键和值,我可以这样做lMap.Key(1).Value(2).Key(3).Value(4);Key()创建一个新Key对象,将其添加到映射中,并返回Key&对新键的引用。也许我稍后会摆脱显式Key类型,但现在这就是我所拥有的。Key()我喜欢与类似 的简洁性CreateKey(),我认为它在这种情况下的作用是可以理解的。

4

3 回答 3

8

TypeBInterface格式不正确,但我认为编译器不需要诊断。问题是它第一次TypeA在返回类型中看到,它查找它,在类中什么都看不到,然后找到类。但是,C++ 中有一条规则说,在类定义中使用的每个标识符在类定义的末尾仍然必须具有相同的含义。但是,如果你TypeA在方法声明之后查找,它会找到方法,而不是类型,因此含义发生了变化。

TypeB只是无效。当它TypeA在返回类型位置看到时,查找将找到TypeBInterface::TypeA不是类型的函数。

解决方案:不要那样做。

于 2013-06-11T13:33:56.527 回答
1

由于问题在于隐藏名称,因此您确实必须使用类型的完全限定名称,或者创建一个回避问题的 typedef。

于 2013-06-11T14:14:14.810 回答
0

长话短说,该代码在语法上是无效的。作为一个硬性规则,你不应该有一个与类/类型同名的方法,除了构造函数。

于 2013-06-11T13:38:27.257 回答