问题 为什么重载operator


对于以下结构

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

我想要超载 operator<< 打印 mat 成员来 std::cout。我试过了

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

这会导致段错误。任何人都可以向我解释原因吗?

一个最小的工作示例:

#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;
}

我正在使用Ubuntu 18.04上的g ++版本7.3.0和Eigen版本3.4进行编译。


5720
2017-09-20 09:10


起源

你必须退货 std::ostream 来自运算符重载实现的引用,例如, return out << object.mat;。非返回任何内容的非void函数通常用一些编译器警告标记,可能值得启用这些函数(例如, -Wall -pedantic)。 - lubgr


答案:


重载的返回值 operator<< 是 std::ostream&。但是,你没有从中返回任何东西。

请执行下列操作:

out << object.mat;
return out;

或者,

return out << object.mat;

14
2017-09-20 09:14



要不就 return out << object.mat; - john