У меня есть некоторый код C ++ в Visual Studio 2015, который компилируется и отлично работает на моей машине, но не на моем партнере по команде.
У нас точно такая же база кода и точно такие же версии всехте же библиотеки, но на его компьютере Visual Studio не может правильно разрешить некоторые макросы шаблонов, в то время как мой работает нормально.
Я пытаюсь воссоздать его среду сборки, чтобы воспроизвести проблему. Мы оба используем Visual Studio 15, обновление 3, версия 14.0.25431.01, но версии Visual C ++ 2015 отличаются, но я не могу найти способ указать версию, которую я хотел бы использовать в Visual Studio.
Как мне это сделать? И вообще, как я могу гарантировать, что наши среды сборки совместимы в Visual Studio?
РЕДАКТИРОВАТЬ: Чтобы получить дополнительную информацию из комментариев о том, что мы сделали до сих пор:
- Мы оба используем одну и ту же версию Visual Studio 2015 (обновление 3, версия 14.0.25431.01)
- Обеспечение того, чтобы наши библиотеки относились к каталогу решений и загружались вместе с репозиторием проекта, поэтомунет неправильных путей
- Включены файлы репозитория и решения в репозиторий и гарантировано, что они имеют одинаковую
- версию целевой платформы (версия Windows SDK): Windows 8.1
- Набор инструментов платформы: Visual Studio 2015 (v140)
РЕДАКТИРОВАТЬ: Как упоминалось @Marek R, я должен включить точную ошибку, которую я имел: я пытаюсь сделать некоторыеобработка сигналов с помощью библиотеки Eigen.
Точная строка, на которой происходит сбой, пытается инициализировать массив следующим образом:
Eigen::ArrayX<int> foo(size_of_the_array)
, затем использовать этот массив следующим образом:
foo(index) = bar
Eigen использует макрос над шаблоном, используя операторы, чтобы переопределить этот тип следующим образом: Eigen::Array<int,-1,1>
Это работает, как и ожидалось, на моем компьютере, но при попытке скомпилировать его, он не работает
3>HighRes.cpp(187): error C2514: 'Eigen::Array<int,-1,1,,-1,1>': class has no constructors
3> c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(188): error C2039: 'size': is not a member of 'Eigen::Array<int,-1,1,,-1,1>'
3> c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(188): error C2039: '__this': is not a member of 'Eigen::Array<int,-1,1,,-1,1>'
3> c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(189): error C2064: term does not evaluate to a function taking 1 arguments
Что еще более странно, так это то, что другие разделы кода имеют похожие вызовы к этому макросу, но с другими типами, например: Eigen::ArrayX<bool> baz(some_other_size);
, и его сборка на это не жалуется. Я пытаюсь воспроизвести это поведение на своем.
ОБНОВЛЕНИЕ: У меня был шанс поиграть с его машиной немного больше, и я заметил пару вещей:
1: Его машина прекрасно работает Eigen::ArrayX<T>
где-нибудь еще, кроме определенного раздела кода, который не удалось построить ранее
2: Единственное, что особенного в этом конкретном разделе, это то, что он находится внутри замыкания
auto process_in_parallel = [state](int dimension){
// Other code...
Eigen::ArrayX<int> foo(size_of_the_array);
3: Eigen использует вложенные макросы для определения шаблона, используя операторы, которые определяют класс ArrayX.
У меня действительно было много проблем с получением Visual Studio 15 для работы с шаблоном, используяоператоры и вложенные шаблоны классов;компилятор часто зависал и просто просил меня упростить мой код вокруг заданной строки. Я рад обойти это, изменив определение на Eigen::ArrayXi
;псевдоним не шаблонного типа. Это прекрасно компилируется, и сборка проходит все тесты.