简体   繁体   中英

Why does overloading operator<< to print Eigen class member result in a segfault?

For the following struct

struct TestClass {
  TestClass() : mat(Eigen::Matrix3i::Zero()) {}
  Eigen::Matrix3i mat;
};

I would like to have an overloaded operator<< to print the mat member to std::cout . I tried

std::ostream& operator<<(std::ostream& out, const TestClass& object) {
    out << object.mat;
}

This results in a segfault. Can anyone explain to me why?

A minimum working example:

#include <iostream>
#include <Eigen/Core>

struct TestClass {
  TestClass() : mat(Eigen::Matrix3i::Zero()) {}    
  Eigen::Matrix3i mat;
};

std::ostream& operator<<(std::ostream& out, const TestClass& object) {
  out << object.mat;
}

int main() {
  TestClass testObject;

  std::cout << testObject.mat << "\n\n"; // This works fine.
  std::cout << testObject << '\n'; // This results in a segfault.

  return 0;
}

I'm compiling with g++ version 7.3.0 and Eigen version 3.4 on Ubuntu 18.04.

The return value of the overloaded operator<< is std::ostream& . However, you are not returning anything from it.

Do the following:

out << object.mat;
return out;

or alternatively,

return out << object.mat;

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