是否可以更改'this'关键字的类型?

时间:2015-03-25 12:09:45

标签: c++ gcc corba

现在这可能看起来像一个奇怪的问题,但是我遇到了一个刚刚引起我注意的编译器错误,即使有一个修复,我也想知道它为什么会破坏。 / 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*)

1 个答案:

答案 0 :(得分:1)

register_callback需要NotifyExt::ReconnectionCallback,而不是POA_NotifyExt::ReconnectionCallback(请注意不同的名称空间)。

MyClass是所谓的Servant:实现CORBA接口的服务器端对象。

由于CORBA旨在独立于位置和语言,因此对象的客户端不直接引用Servant;它使用"对象引用"其中包含到达对象所需的信息。因此,您需要将对象引用传递给MyClass Servant实现的CORBA对象。

获得此类引用的一种方法是使用_this()成员函数。