возвращение надбавочной матрицы ublas по значению, работающей только в конфигурации выпуска для vs2012

Я использую Visual Studio 2012, и я выделил проблему в своем коде для этого, но я не могу ее решить. При запуске в режиме релиза он работает отлично, но я получаю сообщение об ошибке, если я запускаю его в режиме отладки.
Код является:

#include "stdafx.h"
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

typedef boost::numeric::ublas::matrix<double> BMT;

BMT fun()
{
BMT mym;
mym.resize(3,3);
for(int i = 0; i<9;++i) mym(i/3,i%3)=i;
std::cout << mym << std::endl;
return mym;
}

int main(int argc, char* argv[])
{
fun();
//closing message
std::cout<<std::endl<<"press enter to exit."<<std::endl;
std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}

и ошибка в отладке следующая:

1>------ Build started: Project: myproject, Configuration: Debug x64 ------
1>  myapp.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xmemory(348): error C4996: 'std::_Uninitialized_copy0': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xmemory(333) : see declaration of 'std::_Uninitialized_copy0'
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/storage.hpp(94) : see reference to function template instantiation '_FwdIt std::uninitialized_copy<const double*,double*>(_InIt,_InIt,_FwdIt)' being compiled
1>          with
1>          [
1>              _FwdIt=double *,
1>              _InIt=const double *
1>          ]
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/storage.hpp(89) : while compiling class template member function 'boost::numeric::ublas::unbounded_array<T>::unbounded_array(const boost::numeric::ublas::unbounded_array<T> &)'
1>          with
1>          [
1>              T=double
1>          ]
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/matrix.hpp(160) : see reference to function template instantiation 'boost::numeric::ublas::unbounded_array<T>::unbounded_array(const boost::numeric::ublas::unbounded_array<T> &)' being compiled
1>          with
1>          [
1>              T=double
1>          ]
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/matrix.hpp(100) : see reference to class template instantiation 'boost::numeric::ublas::unbounded_array<T>' being compiled
1>          with
1>          [
1>              T=double
1>          ]
1>          junkApp1.cpp(10) : see reference to class template instantiation 'boost::numeric::ublas::matrix<T>' being compiled
1>          with
1>          [
1>              T=double
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Вы знаете, в чем может быть проблема?

3

Решение

У меня была похожая проблема с использованием убласа.
Я не уверен, в чем может быть причина, но я предполагаю, что это связано с копированием убласа при записи / копировании по требованию. Будет ли вариант просто использовать определение -D_SCL_SECURE_NO_WARNINGS и покончить с этим? Я установил это глобально, так как я считаю, что 90% этих предупреждений OS в любом случае указывает BS.

2

Другие решения

Проблема в том, что вы компилируете предупреждения, которые рассматриваются как ошибки.

РЕДАКТИРОВАТЬ: Microsoft решила, что некоторые части C ++ (и C) устарели, и компилятор сообщает об использовании этих частей как ошибки, если не определено _SCL_SECURE_NO_WARNINGS (соответственно _CRT_SECURE_NO_WARNINGS).

1

По вопросам рекламы [email protected]