2012-04-22 6 views
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 

Но это не работает.

+1

'reinterpret_cast' должен работать. – sth

+1

Реинтерпрет литье очень странно применять. но я уже это сделал. coul'nt углу проблемы. вообще. –

+0

Что такое тип возврата ** ns3 :: NetDevice :: GetChannel() **? – DumbCoder

ответ

1

Возвращаемый тип ns3::NetDevice::GetChannel() является своего рода пользовательских смарт-указатель; не видя определения этого, мы можем только догадываться, как вы можете преобразовать это в необработанный указатель.

Возможно, он реализует оператор преобразования operator T*(), хотя это обычно считается плохой идеей, поскольку он делает непреднамеренные преобразования слишком легкими для выполнения случайно. В этом случае, вы можете сделать:

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

В противном случае, возможно, он имеет функцию чтобы преобразовать в сырой указатель. Стандартный смарт-указатели обычно называют это get():

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

Если он не предлагает, что, и вы действительно хотите, чтобы получить сырой указатель, то вы могли бы разыменованием и возьмите указатель на разыменованный объект (при условии, он поддерживает dererencing, в противном случае, это немного странно называть это указатель на всех):

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

После того, как у вас есть void *, вы можете использовать static_cast, чтобы изменить его в unsigned char *, если это то, что вы хотите. Будьте осторожны с тем, что вы делаете с ним, поскольку беспорядок с байтами объекта может легко привести к неопределенному поведению.

UPDATE: если ns3::Ptr это шаблон документально here, то вы можете получить сырье указатель с помощью:

void * check = PeekPointer(ns3::NetDevice::GetChannel()); 
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; 
}; 
+0

Это совершенно не относится к вопросу. – Puppy

+0

Это будет работать, только если эта вещь 'Ptr' конвертируется в' void * '. У нас недостаточно информации, чтобы рассказать. –

+0

Кроме того, стандарт гарантирует, что 'reinterpret_cast' может преобразовывать любой тип указателя объекта в любой другой тип указателя объекта и обратно, давая исходное значение; ваш двойной состав не является более безопасным и более переносимым, чем один «reinterpret_cast». –

 Смежные вопросы

  • Нет связанных вопросов^_^