成员函数和类名之间的名称冲突

时间:2014-12-30 06:35:41

标签: c++ name-clash name-conflict name-collision

我正在用wxWidgets写一个国际象棋程序。有一次,我有一个wxGLCanvas的子类,它使用了我写的Move类。不幸的是,似乎有一个方法wxWindowBase::Move(),所以我对list<Move> li形式的所有语句都不会编译。

有什么好方法可以解决这个问题吗?我已经尝试了list< ::Move> li,这确实解决了问题,但这很糟糕,我必须在任何地方做出改变。与名称空间冲突不同,使用声明似乎对此没有帮助。

2 个答案:

答案 0 :(得分:3)

有几种方法可以消除由方法名称隐藏的基类的歧义。

typedef Move::Move Move_Base; // 1. the LHS of :: operator ignores functions
using typename Move::Move; // 2. non-template "typename" avoids constructor
typedef class Move Move_Base; // 3. elaborated type specifier
typedef ::Move Move_Base; // 4. namespace qualification (as mentioned)
由于存在错误,

(1)可能无法在GCC中运行。 (不确定;你可以试试看。)

(2)可能是最优雅的,但编译器必须正确地获得一些C ++ 11的细微差别。 {+ 1}}关键字在C ++ 03中是非法的,但我认为没有必要。在C ++ 11中,语法引用构造函数而不是类型名称,除非您说typename

您需要将继承的函数限定为typename

(3)仅当基类是当前命名空间的一部分时才有效,通常它不应该是。

(4)有点痛苦,因为如果移动到另一个命名空间,对其封闭命名空间进行硬编码的类需要修改。如你所说,有点难看。

答案 1 :(得分:1)

将您的代码放入命名空间。然后,您的课程将为something::Move,并且不会轻易发生冲突。