Я пишу 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
Просто верните указатель по значению:
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 по-прежнему остается лишь ссылкой, они не волшебным образом продлевают жизнь объектов.