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の代わりに2 つ使用することをお勧めします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 に答える