템플릿 클래스 CConstraint에서 int에 대한 확인 멤버 함수의 명시적 특수화는 클래스의 네임스페이스 외부에서 정의됩니다. 이는 C 표준 위반으로 인해 g에서 오류가 발생합니다.
C 03 §14.7.3/2에 따르면 템플릿이 멤버로 속한 네임스페이스에서 명시적 특수화를 선언해야 합니다. 바깥쪽 클래스 또는 바깥쪽 클래스 템플릿이 멤버인 네임스페이스의 템플릿.
이 문제를 해결하려면 int에 대한 확인의 명시적인 특수화를 수행해야 합니다. CConstraint의 네임스페이스 내에서 선언되어야 합니다. 이는 다음 수정된 코드를 사용하여 달성할 수 있습니다:
<br>template<typename T><br>class CConstraint<br>{<br>public:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">CConstraint() { } virtual ~CConstraint() { } template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int position, int constraints[]) { }
};
또한 멤버 함수의 명시적 특수화에는 포함 클래스의 명시적 특수화가 필요하므로 , 더 나은 해결책은 확인 기능을 클래스 밖으로 별도의 클래스로 옮기는 것입니다. 네임스페이스:
네임스페이스 세부정보
{
template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int position, int constraints[]) { }
}
템플릿
클래스 C제약
{
// ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); }
};
위 내용은 네임스페이스 외부의 멤버 함수를 명시적으로 특수화하면 C 컴파일 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!