operator<<
을 포인터로 호출 할 때 문제가 있습니다. 나는 SO를 통해 검색 한 후 Google에서 내 질문을했지만 제안 된 모든 해결책이 내 문제를 해결하지 못했습니다.오버로드 된 std :: ostream 연산자 << 호출되지 않음, 스트림이 객체 대신 변수 주소를 가져옵니다.
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<<
을 어떻게 오버로드해야합니까?
어떤 도움을 주셔서 감사합니다.
참고 : 포인터 과부하, 두 가지가 누락되었습니다. 'Marker' 인스턴스는 어떤 식 으로든 변형되지 않기 때문에'Marker const * marker'를 읽어야합니다; 그리고 경우에 따라서는 ''을 출력 할 것입니다. –
'std :: ostream & operator << (std :: ostream & out, Marker * marker)'를 자신의 컴파일 유닛 (즉, .cpp 파일)에서 (비 - 인라인) 함수로 정의하려고하면 링커를 행복하게 만드는가? –
컴파일러는 논쟁하지 않지만이 DLL을 포함하는 프로젝트는'std :: ostream & operator << (std :: ostream & out, Marker * marker)'함수에서'unresolved external symbol'을 컴파일하지 않습니다. 이 함수가 전역 이름 공간에 정의되어야합니까? 내 경우에는 모든 클래스와 오버로드 된 연산자 함수가 내 네임 스페이스 안에 있습니다. –