2012-05-24 4 views
-2

Я вообще не гуру C++, и я попытался воспроизвести эту ошибку в нескольких процедурах. дело в том, что когда я делаю небольшую программу с 2 o 3 классами, что я хочу делать, ошибки нет. но в основном приложении я пытаюсь написать ошибку, даже если я пробовал много (даже бессмысленных) решений.странная ошибка при прохождении указателей (* &) в конструкторе

проблема заключается в том, что у меня есть основной класс, который создает некоторые ресурсы (в качестве указателей) и шаблон стратегии, который определяет различные конкретные поведения, которые принимают в конструкции ресурсы thoose.

в главном приложении, Init():

device = new Kinect(); 
controls = new Gui(); 

UserPositionBehaviour = new UserPositionBehaviour(device, controls); 

и поведение конструктора:

UserPositionBehaviour(Kinect * device, Gui * controls); 

это ошибка:

src/App.cpp:30: error: no matching function for call to ‘UserPositionBehaviour::UserPositionBehaviour(Kinect*&, ofTrueTypeFont*&, ofxGui*&)’ 
src/UserPositionBehaviour.h:15: note: candidates are: UserPositionBehaviour::UserPositionBehaviour(Kinect*, ofxGui*, ofTrueTypeFont*) 
src/UserPositionBehaviour.h:13: note:     UserPositionBehaviour::UserPositionBehaviour(const UserPositionBehaviour&) 

а ?? hei, что происходит? Я прохожу указатели, а не * & (что я не знаю, как читать)

какой-нибудь совет?

я пытался повторить ошибку с простым случаем основывается только на couts но нет никаких проблем, так mayebe есть некоторые ошибки скрыты somewhereelse ..

+3

Код, который вы показываете нам, показывает конструктор с двумя аргументами; в сообщении об ошибке говорится, что существует три аргумента и один аргумент. Что-то здесь не так, может быть, вы могли бы показать нам настоящий код? –

+0

Не существует конструктора, который принимает два аргумента. – hmjd

+1

Возможно ли, что вы включаете заголовок, содержащий другую версию 'UserPositionBehaviour', чем та, которую вы ожидаете? – molbdnilo

ответ

3

В соответствии с сообщением об ошибке вы вызываете конструктор с тремя аргументами, а не двумя, и у вас есть два последних неправильных пути.

Если это сообщение реальная ошибка, то ваш код, вероятно, выглядит следующим образом:

UserPositionBehaviour = new UserPositionBehaviour(device, font, controls); 
//              ^^^^ ^^^^^^^^ 

и должно быть:

UserPositionBehaviour = new UserPositionBehaviour(device, controls, font); 
//              ^^^^^^^^ ^^^^ 

Если код действительно выглядит как то, что вы опубликовали, и дает сообщение об ошибке, то происходит что-то действительно странное; в этом случае отправьте полный компилируемый пример, чтобы мы могли продолжить расследование.

Вы можете игнорировать дополнительные сообщения & s в сообщении gcc: это немного странный способ сказать, что он ищет функции, которые принимают свои аргументы либо по значению, либо по ссылке.

+0

ok спасибо, мой мозг кипит! – nkint

1

Код должен составить, если действительно есть конструктор

UserPositionBehaviour(Kinect * device, Gui * controls); 

определено, что, в соответствии с компилятором, вы не:

src/UserPositionBehaviour.h:15: note: candidates are: UserPositionBehaviour::UserPositionBehaviour(Kinect*, ofxGui*, ofTrueTypeFont*) src/UserPositionBehaviour.h:13: note:
UserPositionBehaviour::UserPositionBehaviour(const UserPositionBehaviour&)

*& просто означает, что вы передаете ро inter посредством ссылки, то есть его можно изменить внутри конструктора.

3

Код, вызывающий ошибку, содержит три аргумента (не два, как вы думаете), и у него есть последние два в неправильном порядке. Вы должны искать неправильную версию исходных файлов или что-то в этом роде.

Проверяйте глупые вещи, такие как устаревшие копии src/UserPositionBehaviour.h и src/App.cpp, лежащие вокруг, на которые вы можете смотреть вместо того, чтобы смотреть на версию, которую компилятор фактически компилирует. Или, может быть, вы используете предварительно скомпилированные заголовки, и там что-то пошло не так.

Сообщение об ошибке для не найденной функции обычно будет выглядеть так. Foo *& - это тип «ссылка на указатель на Foo», и это просто означает, что выражение вашего аргумента является указателем lvalue-to-Foo. Этот вызов может соответствовать функции, которая принимает указатель по значению или функцию, которая принимает указатель по ссылке. Компилятор тоже не нашел, но он должен выбрать что-то для сообщения об ошибке, и ваш компилятор выбирает его. Если ваш вызов содержал выражение аргумента device+0 вместо device, тогда он не будет иметь права на передачу по неконстантной ссылке (потому что результат device+0 является временным), и сообщение об ошибке не будет иметь &.

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