我正在寻找解释为什么以下代码无法在Windows上编译的原因:
class TypeA {};
class TypeBInterface
{
public:
~TypeBInterface() {}
virtual TypeA& TypeA() = 0;
};
class TypeB : public TypeBInterface
{
public:
TypeA& TypeA() { return mTypeA; }
private:
TypeA mTypeA;
};
Run Code Online (Sandbox Code Playgroud)
返回类型TypeA和方法名称之间存在某种命名冲突TypeA.以下返回类型工作正常:
::TypeA& TypeA() { return mTypeA; }
Run Code Online (Sandbox Code Playgroud)
我不理解导致此行为的C++规则.我可以得到一个简单的解释吗?
编辑: @BalogPal请求更多上下文.我正在使用方法链来构建一个地图对象.为了添加键和值,我可以做lMap.Key(1).Value(2).Key(3).Value(4);.Key()创建一个新Key对象,将其添加到地图,并返回Key&对新键的引用.也许我稍后会摆脱明确的Key类型,但是现在这就是我所拥有的.我喜欢简约Key()与喜欢的东西CreateKey(),我认为在这种情况下它的作用是可以理解的.
TypeBInterface我认为编译器格式不正确,但编译器无需诊断.问题是它第一次TypeA在返回类型中看到它,它查找它,在类中看不到任何内容,然后找到该类.但是,C++中有一条规则,即类定义中使用的每个标识符在类定义的末尾仍然必须表示相同的内容.但是,如果您TypeA在方法声明后查找,它将找到方法而不是类型,因此更改了含义.
TypeB只是无效.当它TypeA在返回类型位置看到时,查找将找到该函数TypeBInterface::TypeA,该函数不是类型.
解决方案:不要这样做.