Visual C+;中同名内部类的问题+; 我有一个问题,Visual C++ 2005,显然是内部类同名,但在不同的外部类混淆。
问题出现在两个层中,其中每个层都有一个监听器接口作为内部类。B是a的侦听器,在其上面的第三层中有自己的侦听器(未显示) 代码的结构如下所示: A.h B.h A::Listener()和A::~Listener()在A.cpp中定义 B.cpp 我得到了错误Visual C+;中同名内部类的问题+; 我有一个问题,Visual C++ 2005,显然是内部类同名,但在不同的外部类混淆。,c++,visual-c++,namespaces,inner-classes,C++,Visual C++,Namespaces,Inner Classes,问题出现在两个层中,其中每个层都有一个监听器接口作为内部类。B是a的侦听器,在其上面的第三层中有自己的侦听器(未显示) 代码的结构如下所示: A.h B.h A::Listener()和A::~Listener()在A.cpp中定义 B.cpp 我得到了错误 B.cpp(49) : error C2509: '{ctor}' : member function not declared in 'B' Pr> C++编译器对于ReSAS S2A没有问题,但是它在某些方面比Visual C++更
B.cpp(49) : error C2509: '{ctor}' : member function not declared in 'B'
<> Pr> C++编译器对于ReSAS S2A没有问题,但是它在某些方面比Visual C++更开放。
如果我将侦听器接口重命名为具有不同的名称,问题就会消失,但我希望避免这种情况(真正的类名而不是A或B相当长)
是我正在做的正确的C++,还是由Visual C++提出的抱怨?
有没有办法在不重命名侦听器接口的情况下解决此问题?您发布的代码产生了与您在我的机器上描述的相同的编译器错误。我自己也不太确定到底是什么问题,但我觉得从纯虚拟类继承并在后代中声明纯虚拟类可能不是一个好主意 我设法编译了一个修改过的版本,也许这有助于解决您的问题:
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
如果使用typedefs隐藏侦听器的名称,至少我的演示代码会编译并链接:
//标题
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(){}
什么是“{ctor}”?是不是
B::Listener::Listener()
?您确定头文件或实现文件中没有输入错误,例如声明和定义不匹配吗?另外,我假设在类声明之后有分号,A::~Listener()
已定义,A::Listener
为public。我可以告诉你,如果这些都已修复,那么在OS X 10.5.8.starblue上的g++4.0.1上编译的代码将被修复。我修复了它,以实际重现问题-请下次亲自修复。谢谢,我还在B
中添加了缺少的public
。不幸的是,如果没有内联声明构造函数和析构函数,链接时会导致重复符号。内联声明它们是不可能的,因为它违反了我们的编码规则(由QAC检查)。因为我喜欢这样的谜语,我尝试了另一个技巧-使用typedef隐藏名称worksNice,我将在下周尝试。这也适用于sh2a目标编译器。它有一个小问题,Eclipse看到构造函数的语法错误。
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() {}
};
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(){}