Ошибка C2864 при работе с OpenCV

155
19 января 2020, 18:10

Кто сталкивался с данной проблемой при работе с OpenCV? Язык С++, работаю в VS2013.

Ошибка 1 error C2864: "cv::sfinae::has_parenthesis_operator::value": статический элемент данных с инициализатором внутри класса должен иметь неизменяемый целочисленный тип const c:\users\admin\documents\visual studio 2013\projects\opencv2\core\cvstd_wrapper.hpp 52 1 Second_test

Вот собственно и весь код:

#include "opencv2/core/core.hpp"
#include <opencv2/core/types_c.h>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/core/core_c.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
int main(int argc, char** argv)
{
    system("pause");
    return 0;
}
Answer 1

Объявление этой строке в cvstd_wrapper.hpp имеет вид

static CV_CONSTEXPR bool value = type::value;

Такое объявление будет корректным в С++ только если CV_CONSTEXPR заменяется на constexpr или на const (или на inline, но здесь подразумевается константность).

Определение макроса в cvdef.h имеет вид

#ifndef CV_CONSTEXPR
#  if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900/*MSVS 2015*/)
#    define CV_CONSTEXPR constexpr
#  endif
#endif
#ifndef CV_CONSTEXPR
#  define CV_CONSTEXPR
#endif

То есть по какой-то причине они не определяют CV_CONSTEXPR как const тогда, когда не могут определить его как constexpr. Это странно.

История изменений показывает такое 22 дня назад

  #ifndef CV_CONSTEXPR
- #  define CV_CONSTEXPR const
+ #  define CV_CONSTEXPR
  #endif

То есть const там таки был, но некто "alalek" выкосил этот const нафиг. Скорее всего он исправлял что-то другое, но в результате "убил" это место в cvstd_wrapper.hpp. К тому же, судя по тому, что это fallback, это "перетягивание каната" длится уже некоторое время. Типичный опенсорсовский бардак.

Как видно по комментарию к этому коммиту, в других местах кода у них используются объявления вида

static CV_CONSTEXPR const int var = ...;

с явным const. Но раз "alalek" сделал это исправление, то тогда нужно приводить к этому виду - с явным const - все такие места, включая cvstd_wrapper.hpp тоже.

Либо ждите пока исправят этот косяк, либо берите более новую версию VS и работайте в режиме C++11 или выше.

READ ALSO
Многопоточная обработка файлов в Qt C ++

Многопоточная обработка файлов в Qt C ++

Как организовать многопоточную обработку файлов (открытие, сбор данных, закрытие) из массива QFileInfoList?

153
Проблема с вектором в C++

Проблема с вектором в C++

Есть вот такой класс Student

140
Discord JDA. Как удалять сообщения в Discord?

Discord JDA. Как удалять сообщения в Discord?

Столкнулся с такой проблемой: нужно удалить N сообщений на канале в дискордеКак это сделать?

110