我有一个Visual C ++ 2005的问题,显然内部类具有相同的名称,但在不同的外部类中是混淆的。
两个层出现问题,其中每个层都有一个侦听器接口作为内部类。 B是A的监听器,并且在其上方的第三层(未示出)中具有其自己的监听器。
代码的结构如下所示:
A.H
class A
{
public:
class Listener
{
public:
Listener();
virtual ~Listener() = 0;
};
// ...
};
B.h
class B : public A::Listener
{
class Listener
{
public:
Listener();
virtual ~Listener() = 0;
};
// ...
};
A :: Listener()和A ::〜Listener()在A.cpp中定义。
B.cpp
B::Listener::Listener() {}
B::Listener::~Listener() {}
我收到错误
B.cpp(49) : error C2509: '{ctor}' : member function not declared in 'B'
Renesas sh2a的C ++编译器对此没有任何问题,但在某些其他方面它也比Visual C ++更自由。
如果我将侦听器接口重命名为具有不同的名称,则问题就会消失,但我想避免这种情况(真正的类名而不是A或B相当长)。
我正在做的是正确的C ++,还是Visual C ++的投诉是合理的?
有没有办法在不重命名侦听器接口的情况下解决此问题?
答案 0 :(得分:1)
您发布的代码产生了您在我的机器上描述的相同编译器错误。我不太确定自己究竟是什么问题,但我有一种感觉,即从纯虚拟类中继承并在后代中声明一个纯虚拟类可能不是一个好主意。
我设法编译了一个修改版本,也许这可以帮助您解决问题:
class OuterA
{
public:
class Listener
{
public:
Listener() {}
virtual ~Listener() = 0 {}
};
OuterA() {}
~OuterA(){}
};
class OuterB : public OuterA::Listener
{
public:
class Listener
{
public:
Listener() {}
~Listener() {}
};
OuterB() {}
~OuterB() {}
};
//编辑以避免内联ctor和dtor
如果使用typedef隐藏监听器的名称,至少我的演示代码编译和链接:
// header
class OuterA
{
public:
class Listener
{
public:
Listener();
virtual ~Listener() = 0;
};
OuterA();
~OuterA();
};
class OuterB : public OuterA::Listener
{
public:
class Listener
{
public:
Listener();
virtual ~Listener() = 0;
};
OuterB();
~OuterB();
};
//实施
OuterA::OuterA(){}
OuterA::~OuterA(){}
OuterA::Listener::Listener(){}
OuterA::Listener::~Listener(){}
typedef OuterB::Listener BListener;
OuterB::OuterB() {}
OuterB::~OuterB(){}
BListener::Listener(){}
BListener::~Listener(){}