我正在用wxWidgets写一个国际象棋程序。有一次,我有一个wxGLCanvas
的子类,它使用了我写的Move
类。不幸的是,似乎有一个方法wxWindowBase::Move()
,所以我对list<Move> li
形式的所有语句都不会编译。
有什么好方法可以解决这个问题吗?我已经尝试了list< ::Move> li
,这确实解决了问题,但这很糟糕,我必须在任何地方做出改变。与名称空间冲突不同,使用声明似乎对此没有帮助。
答案 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
,并且不会轻易发生冲突。