C++ 템플릿과 모호성 문제 :내가 같이 포인터 클래스의 부분 집합이
template <typename T>
struct Pointer
{
Pointer();
Pointer(T *const x);
Pointer(const Pointer &x);
template <typename t>
Pointer(const Pointer<t> &x);
operator T *() const;
};
마지막 생성자의 목표는 서브 클래스의
Pointer
, 또는이다 기본적으로 모든 종류의를 통과 할 수 있도록하는 것입니다
을 암시 적으로 T *
으로 변환됩니다. 이 실제 규칙은 생성자의 정의에 의해서만 적용되며 컴파일러는 선언으로 혼자만 알아낼 수 없습니다. 내가 그것을 놓고 을 Pointer<Base>
의 생성자에 전달하려고 시도하면 가능한 경로가 operator T *()
임에도 불구하고 컴파일 오류가 발생합니다.
위의 문제를 해결하는 동안 다른 문제가 발생합니다. 한 오버로드가 Pointer<UnrelatedClass>
이고 다른 하나가 Pointer<BaseClass>
인 오버로드 된 함수가 있고 Pointer<SubClass>
을 호출하려고하면 두 개의 오버로드 사이에 모호성이 생기므로 의도적으로 해당 오버로드가 호출됩니다. .
제안 사항? 질문 명시 적으로 생성자를 만들 수
이 추가 템플릿 인수로 자본'U'를 사용하는 것이 훨씬 더 일반적입니다 :
is_convertible
는 다음과 같이 보인다. 소문자't'는 오타처럼 보입니다. – GManNickG암시 적 변환은 좋지 않습니다. 'operator T *()'대신'T * get()'을 사용하십시오. shared_ptr은 이와 같은 일을합니다. –