여러 가지 유형으로 오버로드되는 매개 변수가있는 함수가 있다고 가정합니다. 예를 들어 :부분 템플릿 과부하
ostream& operator<<(ostream&, ...);
내가 클래스 푸에게
class Foo { ... }
이 그렇다면 내가 과부하
ostream& operator<<(ostream&, const Foo&);
을 정의하고 그것을 잘 작동합니다.
template<class T>
class vector {...}
을 그리고 지금은 T가 유효한 유형을 할 수있는 vector<T>
걸리는 함수의 오버로드를 정의하려면 :
이제 나는 또 다른 클래스가 있다고 가정하자. 가능한 모든 입력 매개 변수에 대해 정의하지 않고이 작업을 수행 할 수 있습니까? 그러한 정의에 어떤 서명을 사용해야합니까?
template<class T>
ostream& operator<<(ostream&, const vector<T>& v);
?
배경 : 나는 실제로 표준에 대한 과부하를 쓰고 싶어이 경우
: 벡터 :
ostream& operator<<(ostream&, const std::vector<T>& x);
같은 뭔가를 작성하는 "{2, 4, 8}" 내 로깅 시스템이 ostream의 최상위에 구축되어 있고 형식을 "문자열 화"하기 위해 내부적으로 연산자 < <을 사용하기 때문에 비슷합니다.
나는이 질문을 일반적으로 제기 할 것이라고 생각했지만이 경우에는 클래스 (예 : 벡터)를 변경할 수 없다는 제약 조건을 추가해야합니다.
template<class T>
ostream& operator<<(ostream&, const vector<T>& v);
이 부분 템플릿 특수화이 아니라 일반적인 함수를 오버로드 확인 규칙에 일치하는 기본 템플릿 기능 :
+1 매우 철저합니다. 아마도 OP는'std :: vector'와는 다른 또 다른'vector'를 구현하고 있습니다.이 경우 친구가 사용되어야합니다. 또한 "이 기능을 참조 할 수있는 방법이 없습니다"? 그것의 주소는 다른 과부하처럼'static_cast' 모호성 제거를 사용하여 찾을 수 있습니다. – Potatoswatter
'참조 할 수있는 방법 없음'설명을 명확히했습니다. –