0

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

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

4

2 回答 2

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 的一些细微差别。C++03中的typename关键字是非法的,但我认为没有必要。在 C++11 中,语法指的是构造函数而不是类型名称,除非你说typename.

您需要将继承的函数限定为wxWindowBase::Move().

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

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

于 2014-12-30T06:51:13.640 回答
1

将您的代码放入命名空间。然后你的课就会something::Move和它不会那么容易发生冲突。

于 2014-12-30T06:40:03.593 回答