Оболочка C для Mat :: at - error: неверная инициализация неконстантной ссылки типа

0

Я пишу C-обертку для Mat :: at, и я делаю одно для всего <typename>. Этот для Vec4s не будет запущен, потому что я добавил &. Я должен был сделать это на всех оболочках Mat::at C для typenames таких как double, float, int т.д., Поэтому я мог бы использовать оболочку для записи в матричный элемент, а также для чтения.

При попытке добавить & в следующую оболочку я получил первую ошибку ниже оболочки. Я добавил вторую и рядом с первой и в нижеописанной оболочке рядом с именем функции и получил вторую ошибку ниже оболочки. Я думал, почему это было С++ 11, почему мой компилятор не принял second &, поэтому я добавил -std = С++ 11 к моему аргументу компилятора (g++ на ubuntu trusty) и получил третье сообщение об ошибке...

Единственное условие - я должен уметь писать матричному элементу с помощью Mat:at wrapper... Любая помощь очень ценится.

Vec4s* &cv_Mat_at_Vec4s1(Mat* self, int i, int j) {
  return &self->at<Vec4s>(i, j);
}

Первая ошибка - оригинальная

 error: invalid initialization of non-const reference of type 
 ‘cv::Vec4s*& {aka cv::Vec<short int, 4>*&} from an rvalue of type 
 ‘cv::Vec<short int, 4>*
 return &self->at<Vec4s>(i, j);

Вторая ошибка: нет -std=c++11

 error: expected unqualified-id before ‘&& token

Третья ошибка - добавлено -std=c++11

 warning: returning reference to temporary
Теги:
opencv

1 ответ

2

Просто верните указатель по значению:

Vec4s* cv_Mat_at_Vec4s1(Mat* self, int i, int j) {
  return &self->at<Vec4s>(i, j);
}

Если вы пишете обертку C, как вы сказали, вы все равно не можете вернуться по ссылке.


FYI, первая ошибка состояла в том, что вы не можете привязывать неконстантные ссылки к временным (временное в вашем случае является результатом приема адреса self->at<Vec4s>(i, j);).

Вторая ошибка заключается в том, что, как вы уже догадались, ссылки на rvalue - это функция С++ 11.

Третья ошибка заключается в том, что вы возвращали ссылку на временное, выходящее за пределы области после возврата функции. Ссылка Rvalue по-прежнему остается лишь ссылкой, они не волшебным образом продлевают жизнь объектов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню