我在指针上调用operator<<时遇到问题。我已经搜索了SO,并在Google上提出了我的问题,但是所有提出的解决方案都无法解决我的问题。为了说明我的问题,请看一段简化的代码:

Marker.h :

class Marker {
     ...
public:
     friend std::ostream& operator<<(std::ostream& out, const Marker& marker);
     friend std::ostream& operator<<(std::ostream& out, Marker* marker);
};

inline std::ostream& operator<<(std::ostream& out, const Marker& marker) {
      out << "Marker " << marker._name << " of type " << marker._type << " at position " << marker._position;
      return out;
}

 inline std::ostream& operator<<(std::ostream& out, Marker* marker) {
      out << *marker;
      return out;
 }

Landmark.h :
 class Landmark {
       ...
       Marker* m_marker;
       ...
 };

Landmark.cpp :
 void Landmark::print( std::ostream& out )
 {
     out << "Marker GENERIC: " << m_marker << std::endl;
     //out << "Marker GENERIC: " << *m_marker << std::endl;
 }

在Visual Studio 2008下,这不链接。我收到许多unresolved external symbol错误。如果我删除friend std::ostream& operator<<(std::ostream& out, Marker* marker);,则代码会编译,但不会获得预期的格式化输出,而是仅获得指向标记Marker* Landmark::m_marker的指针的内存地址。对第二行取消注释会使我的代码无法编译。

我应该如何重载operator<<以获得正确的输出?

我将不胜感激!

最佳答案

这是一个简单的示例:

#include <iostream>

namespace mine {
class Marker {
public:
     friend std::ostream& operator<<(std::ostream& out, const Marker& marker);
     friend std::ostream& operator<<(std::ostream& out, Marker* marker);
};

inline std::ostream& operator<<(std::ostream& out, const Marker& marker) {
     out << "Marker";
     return out;
}

inline std::ostream& operator<<(std::ostream& out, Marker* marker) {
     out << *marker;
     return out;
}
} // namespace mine

int main() {
  mine::Marker marker;
  mine::Marker* m = &marker;

  std::cout << m << "\n";
}

它可以工作as expected

您所指向的错误是链接器错误,它告诉您编译器发出了对未发出函数的方法的调用。

我想您是对我们说谎或Visual Studio再次错误。

如果您撒谎了
  • (即未复制确切的代码):请注意,在定义inline方法时,应在使用整个方法主体之前将其包括在内,因此Landmark.cpp应包括方法定义。
  • 或者,可能有必要通过在与 friend 建立友谊之前预先声明函数来帮助VS,以便VS了解它们确实存在于mine命名空间而不是全局命名空间中。

  • 就像是:
    namespace mine {
      class Marker;
    
      std::ostream& operator<<(std::ostream& out, const Marker& marker);
      std::ostream& operator<<(std::ostream& out, Marker* marker);
    
      class Marker {
      public:
        friend std::ostream& operator<<(std::ostream& out, const Marker& marker);
        friend std::ostream& operator<<(std::ostream& out, Marker* marker);
      };
    
      inline std::ostream& operator<<(std::ostream& out, const Marker& marker) {
        out << "Marker";
        return out;
      }
    
      inline std::ostream& operator<<(std::ostream& out, Marker* marker) {
        out << *marker;
        return out;
      }
    } // namespace mine
    

    关于c++ - 重载的std::ostream运算符<<,未调用,流获取变量地址而不是对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9840952/

    10-13 06:30