简体   繁体   中英

Eigen map from 2d array

Why does this work

typedef Matrix<double, N, N, RowMajor> Mat;
cout << Map<Mat>(&m[0][0]) << endl;

but this doesn't

cout << Map<Matrix<double, N, N, RowMajor>>(&m[0][0]) << endl;

Would it be possible to do the whole thing in one line?

The error was:

eigen_playground.cpp:16:46: warning: use of right-shift operator ('>>') in template argument will require parentheses in
      C++11 [-Wc++11-compat]
    cout << Map<Matrix<double, N, N, RowMajor>>(&m[0][0]) << endl;
                                             ^
                                     (                   )
eigen_playground.cpp:16:46: error: invalid operands to binary expression ('int' and 'double *')
    cout << Map<Matrix<double, N, N, RowMajor>>(&m[0][0]) << endl;
                                     ~~~~~~~~^ ~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:740:1: note: 
      candidate template ignored: could not match 'basic_istream<type-parameter-0-0, type-parameter-0-1>' against
      'Eigen::StorageOptions'
operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:789:1: note: 
      candidate template ignored: could not match 'basic_istream<char, type-parameter-0-0>' against 'Eigen::StorageOptions'
operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:797:1: note: 
      candidate template ignored: could not match 'basic_istream<char, type-parameter-0-0>' against 'Eigen::StorageOptions'
operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:804:1: note: 
      candidate template ignored: could not match 'basic_istream<type-parameter-0-0, type-parameter-0-1>' against
      'Eigen::StorageOptions'
operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:832:1: note: 
      candidate template ignored: could not match 'basic_istream<char, type-parameter-0-0>' against 'Eigen::StorageOptions'
operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:840:1: note: 
      candidate template ignored: could not match 'basic_istream<char, type-parameter-0-0>' against 'Eigen::StorageOptions'
operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:1506:1: note: 
      candidate template ignored: could not match 'basic_istream<type-parameter-0-0, type-parameter-0-1>' against
      'Eigen::StorageOptions'
operator>>(basic_istream<_CharT, _Traits>& __is,
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/istream:1638:1: note: 
      candidate template ignored: could not match 'basic_istream<type-parameter-0-0, type-parameter-0-1>' against
      'Eigen::StorageOptions'
operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/complex:1369:1: note: 
      candidate template ignored: could not match 'basic_istream<type-parameter-0-1, type-parameter-0-2>' against
      'Eigen::StorageOptions'
operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
^
eigen_playground.cpp:16:66: error: expected a type
    cout << Map<Matrix<double, N, N, RowMajor>>(&m[0][0]) << endl;
                                                                 ^
1 warning and 2 errors generated.

The reason you are getting an error is because before C++11, the two adjacent characters " >> " are aggressively interpreted to be a right shift operator .

Since you are using a C++ standard earlier than C++11, simply add a space between those two characters.

cout << Map< Matrix<double, N, N, RowMajor> >(&m[0][0]) << endl;
//                             right here. ^

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM