2011-12-14 3 views
1

Пожалуйста, посмотрите на следующий вызов и соответствующей функции,типажей и ссылка в C++

long pagenumber = 0; 
Node *newNode = createNode(); 
bufMgr->writePage(pageNumber,(char*)newNode); 

и writePage объявляется следующим

writePage(long &pageNumber,char* &node) 

writePage принимает длинную ссылку и символ * эталонную. выше не компилируется, он показывает следующую ошибку

no matching function for call to ‘SampleBufferManager::writePage(long int&, char*)’ 
SampleBufferManager.h:28: note: candidates are: bool SampleBufferManager::writePage(long int&, char*&) 

Может кто-нибудь помочь мне, как справиться с этим ... The напечатанный делает проблему, и код компилируется, если я это сделать в следующим образом:

long pagenumber = 0; 
Node *newNode = createNode(); 
char *test = (char*)newNode; 
bufMgr->writePage(pageNumber,test); 

Как решить проблему?

+0

Вы уже решили проблему передачи справки. Могут быть другие проблемы с этой реализацией, хотя ;-) – AJG85

+0

Подождите, так почему вы не хотите создавать переменную? Это единственный способ сделать это; он не будет работать, как сейчас, только с актерским составом. (См. Ответ Оли, если функции не нужно модифицировать 'char *', и в этом случае вам не нужно создавать переменную) –

+0

Проблема здесь: что делает эта функция WRT 'char'? Должна ли эта функция действительно принимать «Узел» и «? Ты можешь починить это? – curiousguy

ответ

2

Вы не можете привязать ссылку не к const к временному. Результат (char *)newNode является временным (у него нет имени).

Вы можете, однако, привязать ссылку const к временному. Таким образом, вы сможете использовать свою функцию как writePage(long &pageNumber, char* const &node).

+1

Хотя точка передачи его по ссылке, вероятно, должна была его модифицировать, поэтому «const» может победить цель. –

+0

@SethCarnegie: Это хороший момент! –

+0

Технический боковой узел: «_Вы не можете привязывать неконстантную ссылку на временную_» На самом деле, здесь нет временных ограничений! – curiousguy

3

Вы не можете передать ссылку на временно rvalue (спасибо curiousguy). Вы должны сделать переменную и передать:

char* c = (char*)newNode; 
bufMgr->writePage(pageNumber, c); 
+0

или изменить функцию, как наблюдал Оли. –

+0

Вы не можете передать ссылку _non-const_ во временное. Fix'd. – Griwes

+0

@ Griwes ссылка - это неконстантная ссылка. –

1

Что writePage делать? Вы также контролируете эту функцию? Повторное использование второго параметра как const может помочь, если он не пишет на этот адрес. Если это делает, и предполагает его название, что-то, возможно, было бы разумно использовать Node* в нем так или иначе, то есть объявить его как

writePage(long &pageNumber, Node* &node) 

В конце концов, вы не хотите, чтобы ваш Node указатель newNode, чтобы указать на что-то, вообще не является экземпляром Node, потому что он был перезаписан произвольным char. Вы?

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