现在这可能看起来像一个奇怪的问题,但是我遇到了一个刚刚引起我注意的编译器错误,即使有一个修复,我也想知道它为什么会破坏。 / p>
所以假装我正在使用名为Corba的API,它简称用于RPC。在我的程序中,我不得不创建一个派生自Corba对象的对象。
class MyClass : public CorbaClass;
简单的东西,现在在MyClass
的一个方法中我调用一个需要CorbaClass*
的函数,所以我只是传入this
指针,注意方法是不一个const方法,所以这应该可行吗?
但是,在编译I尝试传递的参数实际上是CorbaClass* const
类型的状态时,我收到错误。现在你可以想象我的困惑,当然这是不可能的,这需要this
成为左值而不是吗?所以突然间,这让我质疑我对C ++本身的了解!
现在在TAO的文档(Corba I&m; m的具体实现)中发现,他们实际上有一段代码用于这种情况,我发现他们做了一些奇怪的事情。他们不是直接传递this
,而是调用方法_this()
并从中传递返回,所以我做了一些挖掘,发现该方法在Corba基类中声明为:
CorbaClass* _this(void);
现在这对我来说似乎完全是疯了,但也许那是因为我以前从未碰过它,有没有人知道为什么this
发生任何奇怪的事情?
我相信我使用的编译器是GCC 4.5.1
修改 一些示例代码
MyClass.h
class MyClass
: public POA_NotifyExt::ReconnectionCallback
{
public:
void Initialise();
private:
NotifyExt::ReconnectionRegistry_var m_ReconnectionRegistry;
}
MyClass.cpp
void Initialise()
{
m_ReconnectionRegistry->register_callback( this );
}
生成错误:
error: no matching function for call to ‘NotifyExt::ReconnectionRegistry::register_callback(MyClass* const)’
orbsvcs/NotifyExtC.h:491:63: note: candidate is: virtual NotifyExt::ReconnectionRegistry::ReconnectionID NotifyExt::ReconnectionRegistry::register_callback(NotifyExt::ReconnectionCallback*)
答案 0 :(得分:1)
register_callback
需要NotifyExt::ReconnectionCallback
,而不是POA_NotifyExt::ReconnectionCallback
(请注意不同的名称空间)。
MyClass
是所谓的Servant:实现CORBA接口的服务器端对象。
由于CORBA旨在独立于位置和语言,因此对象的客户端不直接引用Servant;它使用"对象引用"其中包含到达对象所需的信息。因此,您需要将对象引用传递给MyClass
Servant实现的CORBA对象。
获得此类引用的一种方法是使用_this()
成员函数。