네임스페이스 범위 외부의 명시적 특수화: 비표준 G의 오류
C 템플릿 프로그래밍에는 효율적인 코드를 위해 클래스 멤버의 명시적 특수화가 포함됩니다. 세대. 그러나 다음 코드 조각에서 알 수 있듯이 명시적 특수화 배치는 중요합니다.
template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } };
g로 컴파일하면 이 코드는 오류가 발생합니다.
Explicit specialization in non-namespace scope 'class CConstraint'
이해하려면 이 오류가 발생하면 템플릿이 멤버인 네임스페이스 내에서 명시적 특수화를 선언해야 한다고 규정하는 C 표준을 조사해야 합니다. 위의 예에서 CConstraint는 네임스페이스 내에서 선언되지 않았으므로 Verification
그러나 VC 컴파일러는 이 경우 비규격이므로 네임스페이스 범위 외부에서 명시적인 특수화를 허용합니다. 이 동작은 비표준이므로 의존해서는 안 됩니다.
해결책:
이 문제를 해결하고 C 표준을 준수하려면 명시적인 특수화를 선언해야 합니다. 전문적인 템플릿과 동일한 네임스페이스 내에서. 다음은 코드의 수정된 버전입니다.
namespace MyNamespace { template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int, int[]) { } }; }
MyNamespace 네임스페이스 내에서 CConstraint를 캡슐화함으로써 해당 네임스페이스 내에서 해당 명시적 특수화도 선언되도록 보장하여 컴파일 오류를 해결합니다.
또한 C 03은 포함 클래스를 명시적으로 특수화하지 않고 멤버 함수를 특수화하는 것을 금지하므로 제공된 제안에 따라 자유 함수 접근 방식을 사용하는 것도 고려할 수 있습니다. 답변:
namespace detail { template <typename TL> void Verify(int, int[]) {} template <> void Verify<int>(int, int[]) {} } template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); } };
위 내용은 C의 네임스페이스 외부에서 클래스 멤버의 명시적 특수화가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!