파일에 내부 클래스가있는 다음 템플릿이 map.hpp
있습니다.
template<typename Key_T, typename Mapped_T>
class Map {
// public members of Map ...
class Iterator {
//public members of Iterator ...
friend bool operator!=(const Iterator &i, const Iterator &j) {
return (i.link != j.link);
}
// private members of iterator ...
Node * link;
};
};
#include "map.hxx" //implementation file for member methods is separate
에서 main.cpp
나는 다음을 호출하고 지금까지 다 잘 작동합니다 :
Map<int, int> x;
// bunch of insertions ...
for (auto it = x.begin; it != x.end(); ++it) {
// Do something with it ...
}
그러나 친구 함수를 파일에서 다른 구현이 포함 된 파일 map.hpp
로 이동하고 싶습니다 map.hxx
.
Q : 무료 기능을 .hxx
파일 로 이동할 수 있습니까?
Iterator 클래스에서 함수를 친구로 선언하는 데 지 쳤고 구현 파일에서 다음을 수행했습니다.
template<typename Key_T, typename Mapped_T>
bool operator!=(const typename Map<Key_T, Mapped_T>::Iterator & i,
const typename Map<Key_T, Mapped_T>::Iterator & j) {
return (i.link != j.link);
}
그러나 다음과 같이 실패했습니다.
$clang++ -std=c++11 -stdlib=libc++ -Wall -Wextra -g main.cpp
Undefined symbols for architecture x86_64:
"shiraz::operator!=(shiraz::Map<int, int>::Iterator const&, shiraz::Map<int, int>::Iterator const&)", referenced from:
_main in main-3oCRAm.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
감사!
friend
해당 일치하지 않고 선언은 포함하는 네임 스페이스에 새로운 기능을 삽입합니다. 이 기능은 ADL을 통해서만 찾을 수 있습니다.
원하는 작업을 수행하는 가장 쉬운 방법은 iterator
클래스에 스텁 구현을 남겨두고 외부 "실제"함수로 전달하는 것입니다. 이는 ADL 전용 조회를 유지하여 !=
까다로운 과부하 문제를 쉽게 해결합니다. 도우미 함수는 단순히 a 일 template<class Iterator>
수 있고 더 일반적으로 친구가 될 수 있으며 좁은 구현을 가질 수 있으며 ADL을 통해 찾을 수 없지만 정규화 된 조회를 통해 찾을 수 있습니다. 또는 둘러싸는 맵의 정적 멤버 함수일 수 있습니다.
template<typename Key_T, typename Mapped_T>
class Map {
class Iterator;
static bool it_equal( Iterator const&, Iterator const& );
class Iterator {
friend class Map;
friend bool operator!=(const Iterator &i, const Iterator &j) {
return !Map::it_equal(i,j);
}
friend bool operator==(const Iterator &i, const Iterator &j) {
return Map::it_equal(i,j);
}
Node * link;
};
};
이제 .hxx
단순히 구현 bool Map<blah>::it_equal(blah)
하고 완료되었습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다