> 백엔드 개발 > C++ > 네임스페이스 외부의 멤버 함수를 명시적으로 특수화하면 C 컴파일 오류가 발생하는 이유는 무엇입니까?

네임스페이스 외부의 멤버 함수를 명시적으로 특수화하면 C 컴파일 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-04 11:56:11
원래의
692명이 탐색했습니다.

Why Does Explicit Specialization of a Member Function Outside its Namespace Cause a C   Compilation Error?

비네임스페이스 범위의 명시적 특수화

템플릿 클래스 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿