我在指针上调用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 = ▮
std::cout << m << "\n";
}
它可以工作as expected。
您所指向的错误是链接器错误,它告诉您编译器发出了对未发出函数的方法的调用。
我想您是对我们说谎或Visual Studio再次错误。
如果您撒谎了
inline
方法时,应在使用整个方法主体之前将其包括在内,因此Landmark.cpp应包括方法定义。 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/