Search code examples
c++eigenmembercout

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.


Solution

  • 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;