C++: помогите понять, в чём ошибка (и исправить)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

C++: помогите понять, в чём ошибка

Сообщение Bizdelnick »

Пытаюсь собрать некую софтину. Вылезает следующая ошибка:

Код: Выделить всё

/builddir/build/BUILD/openvibe-1.1.0-src/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.cpp:57:110: error: no matching function for call to 'make_pair(OpenViBEPlugins::FileReadingAndWriting::ShmString&, OpenViBE::CIdentifier&)'
    l_vMetaInfoVector->insert(std::make_pair<const ShmString,CIdentifier>(l_sShmVariableName,l_oTypeIdentifier));
                                                                                                              ^
In file included from /usr/include/c++/6.0.0/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/6.0.0/bits/char_traits.h:39,
                 from /usr/include/c++/6.0.0/string:40,
                 from /builddir/build/BUILD/openvibe-1.1.0-src/modules/xml/include/xml/IXMLNode.h:5,
                 from /builddir/build/BUILD/openvibe-1.1.0-src/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifier.h:10,
                 from /builddir/build/BUILD/openvibe-1.1.0-src/toolkit/include/toolkit/ovtk_all.h:77,
                 from /builddir/build/BUILD/openvibe-1.1.0-src/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.h:8,
                 from /builddir/build/BUILD/openvibe-1.1.0-src/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.cpp:1:
/usr/include/c++/6.0.0/bits/stl_pair.h:406:5: note: candidate: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
     make_pair(_T1&& __x, _T2&& __y)
     ^~~~~~~~~
/usr/include/c++/6.0.0/bits/stl_pair.h:406:5: note:   template argument deduction/substitution failed:
/builddir/build/BUILD/openvibe-1.1.0-src/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.cpp:57:110: note:   cannot convert 'l_sShmVariableName' (type 'OpenViBEPlugins::FileReadingAndWriting::ShmString {aka boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> > >}') to type 'const boost::container::basic_string<char, std::char_traits<char>, boost::interprocess::allocator<char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> > >&&'
    l_vMetaInfoVector->insert(std::make_pair<const ShmString,CIdentifier>(l_sShmVariableName,l_oTypeIdentifier));
Или вкратце, если опустить бустовую упоротость: невозможно преобразовать тип в const тип&&.
Самое похожее, что нагуглилось: https://bytes.com/topic/c/answers/135122-ca...char-const-char
В общем всё с указателями понятно. С ссылками, выходит, аналогично? Но главное, чего я понять не могу, это откуда там вообще берутся ссылки.
Вот код, где вылезает ошибка: https://scm.gforge.inria.fr/anonscm/gitweb?...lease-1.1.0#l57
Вот тут определение типа: https://scm.gforge.inria.fr/anonscm/gitweb?...lease-1.1.0#l44
Откуда ссылки, почему ссылки?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: C++: помогите понять, в чём ошибка

Сообщение yoshakar »

Bizdelnick писал(а):
07.02.2016 00:07
Откуда ссылки, почему ссылки?
Ну это ведь не просто ссылки а r-value ссылки из C++11, и, в отличие от обычных ссылок, они действительно могут вылезать из ниоткуда. В данном случае они, видимо, появляются из-за того, что функция std::make_pair в C++11 принимает именно r-value ссылки.
Ничего умного по теме пока мне в голову не пришло, но возник вопрос: это точно правильно, то программа пытается собраться с C++11 (или больше), а не с C++98?
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: C++: помогите понять, в чём ошибка

Сообщение yoshakar »

Вообще странное использование функции make_pair: она ведь и нужна в общем-то чтобы не указывать явно типы. То есть замена "make_pair" на "pair" должна решить проблему, однако мне всё больше кажется что истинная причина в компиляции не тем стандартом.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: C++: помогите понять, в чём ошибка

Сообщение Bizdelnick »

yoshakar писал(а):
07.02.2016 01:43
мне всё больше кажется что истинная причина в компиляции не тем стандартом.

Стандарт явно не задаётся, по умолчанию вроде как должен использоваться gnu++14. Весьма вероятно, что код писался под более старый стандарт...
Хотя не исключён также вариант, это какой-то косяк gcc6.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: C++: помогите понять, в чём ошибка

Сообщение yoshakar »

Bizdelnick писал(а):
07.02.2016 01:55
Стандарт явно не задаётся, по умолчанию вроде как должен использоваться gnu++14. Весьма вероятно, что код писался под более старый стандарт...
Ну значит всё ясно. Код под C++98 однозначно, и несовместим с новыми стандартами. Про конкретно эту проблему вот нарыл: http://stackoverflow.com/questions/9641960...-doesnt-compile — тут всё что я сказал выше + описание деталей (в частности там объяснется откуда берутся ссылки — я выше был не совсем прав, тут дело не просто в rvalue-ссылках, а во взаимодействии lvalue-ссылок c rvalue-ссылками).

Для себя я по прочтению придумал такой контрольный вопрос: что выведет следующая программа при компиляции c -std=gnu++98 и -std=gnu++11?

Код: Выделить всё

#include <iostream>

int main() {
    int a = 10;
    typeof(std::pair<int &, int &>(a, a)) pair1 = std::pair<int &, int &>(a, a);
    typeof(std::make_pair<int &, int &>(a, a)) pair2 = std::make_pair<int &, int &>(a, a);
    a = 20;
    std::cout << pair1.first << std::endl;
    std::cout << pair2.first << std::endl;
    return 0;
}
Я ответил правильно :-)

UPDATE: подпатчил "контрольный вопрос" до более интересного варианта.
Спасибо сказали:
Ответить