3
unsigned char *check = NULL;
check = (dynamic_cast<unsigned char *>( ns3::NetDevice::GetChannel() ));

这就是我正在尝试的。但错误是:

error: cannot dynamic_cast ‘ns3::NetDevice::GetChannel() const()’ (of type ‘class       ns3::Ptr<ns3::Channel>’) to type ‘unsigned char*’ (target is not pointer or reference to class)

我也试过:

reinterpret_cast

但它根本不起作用。

4

2 回答 2

1

的返回类型ns3::NetDevice::GetChannel()是某种自定义智能指针;在没有看到它的定义的情况下,我们只能猜测如何将它转换为原始指针。

也许它实现了一个转换运算符,operator T*()尽管这通常被认为是一个坏主意,因为它使得意外的转换很容易意外进行。在这种情况下,您可以这样做:

void * check = ns3::NetDevice::GetChannel();

否则,也许它有一个成员函数可以转换为原始指针。标准的智能指针通常称之为get()

void * check = ns3::NetDevice::GetChannel().get();

如果它不提供,并且您确实想获得一个原始指针,那么您可以取消引用它并获取一个指向取消引用对象的指针(假设它支持取消引用;否则,将其称为指针有点奇怪全部):

void * check = &*ns3::NetDevice::GetChannel();

一旦你有了一个void *,你可以用static_cast它来改变它unsigned char *,如果这是你想要的。使用它时要小心,因为弄乱对象的字节很容易导致未定义的行为。

更新:如果此处ns3::Ptr记录了模板,那么您可以使用以下方法获取原始指针:

void * check = PeekPointer(ns3::NetDevice::GetChannel());
于 2012-04-22T12:12:49.363 回答
0

最好使用两个static_cast而不是reiterpret_cast. 因为标准不保证不同的指针具有相同的大小。但是,该标准确实保证void*有足够的大小来容纳指向任何数据类型的指针(指向函数的指针除外)。

unsigned char *check = NULL;
check = static_cast<unsigned char*>(static_cast<void*>(ns3::NetDevice::GetChannel()));

Ptr<Channel>必须有重载的运算符,它返回保留的指针:

template<typename T>
class Ptr
{
public:
  operator T*() {return _p;}

private:
  T* _p;
};
于 2012-04-22T11:28:09.977 回答