我正在用 wxWidgets 编写一个国际象棋程序。有一次,我有一个 的子类wxGLCanvas
,它使用了Move
我写的一个类。不幸的是,似乎有一个方法wxWindowBase::Move()
,所以我所有的表单语句list<Move> li
都不会编译。
有什么好的方法可以解决这个问题吗?我已经尝试过list< ::Move> li
,这确实解决了问题,但它很糟糕,我必须在任何地方进行更改。与命名空间冲突不同,使用声明在这里似乎没有帮助。
我正在用 wxWidgets 编写一个国际象棋程序。有一次,我有一个 的子类wxGLCanvas
,它使用了Move
我写的一个类。不幸的是,似乎有一个方法wxWindowBase::Move()
,所以我所有的表单语句list<Move> li
都不会编译。
有什么好的方法可以解决这个问题吗?我已经尝试过list< ::Move> li
,这确实解决了问题,但它很糟糕,我必须在任何地方进行更改。与命名空间冲突不同,使用声明在这里似乎没有帮助。
有几种方法可以消除方法名称隐藏的基类的歧义。
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 的一些细微差别。C++03中的typename
关键字是非法的,但我认为没有必要。在 C++11 中,语法指的是构造函数而不是类型名称,除非你说typename
.
您需要将继承的函数限定为wxWindowBase::Move()
.
(3) 仅在基类是当前命名空间的一部分时才有效,而这通常不应该是。
(4) 有点痛苦,因为如果移动到另一个命名空间,则针对其封闭命名空间硬编码的类需要修改。正如你所说,有点丑。
将您的代码放入命名空间。然后你的课就会something::Move
和它不会那么容易发生冲突。