Пакет Visual Studio NuGet необходимо обновить для новой версии набора инструментов
У меня просто возникла проблема с подключением libpng с Visual Studio 2013. Проблема в том, что в файле пакета были только библиотеки для Visual Studio 2010 и 2012.
Правильное решение - надеяться, что разработчик выпустит обновленный пакет и затем обновит его, но он работал для меня, взломав дополнительную настройку для VS2013, указав на файлы библиотеки VS2012.
Я отредактировал пакет (в папке packages
внутри каталога решения), найдя packagename\build\native\packagename.targets
и внутри этого файла, скопировав все секции v110
. Я изменил v110
на v120
в полях условий только очень осторожно, чтобы пути с именами файлов были все как v110
. Это просто позволило Visual Studio 2013 подключиться к библиотекам на 2012 год, и в этом случае он работал.
Язык позволяет неявное преобразование из double **
в const double *const *
, но не к const double **
. Преобразование, которое вы пытаетесь, будет неявно нарушать правила корректности const, даже если это не сразу очевидно.
Пример в стандарте [de facto standard] C ++ иллюстрирует проблему
https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion
В принципе, правило: после добавления const
на некотором уровне косвенности , вы должны добавить const
ко всем уровням косвенности до упора вправо. Например, int *****
не может быть неявно преобразован в int **const ***
, но он может быть неявно преобразован в int **const *const *const *
Правильно, что double **
не может быть неявно преобразован в const double **
. Однако он может быть преобразован в const double * const *
.
Представьте себе этот сценарий:
const double cd = 7.0;
double d = 4.0;
double *pd = &d;
double **ppd = &pd;
const double **ppCd = ppd; //this is illegal, but if it were possible:
*ppCd = &cd; //now *ppCd, which is also *ppd, which is pd, points to cd
*pd = 3.14; // pd now points to cd and thus modifies a const value!
Итак, если ваша функция не намерена изменять какой-либо из указателей, измените это взять const double * const *
. Если он намеревается внести изменения, вы должны решить, являются ли все его модификации безопасными, и, таким образом, const_cast
можно использовать, или вам действительно нужно пройти в const double **
.