> 백엔드 개발 > C++ > GCC가 네임스페이스 외부의 명시적 전문화를 거부하는 이유는 무엇입니까?

GCC가 네임스페이스 외부의 명시적 전문화를 거부하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-18 22:57:02
원래의
208명이 탐색했습니다.

Why Does GCC Reject Explicit Specialization Outside of a Namespace?

비네임스페이스 범위의 명시적 특수화에 대한 표준과 GCC 불일치

C 표준은 모든 범위에서 선언되는 명시적 템플릿 특수화를 명시적으로 허용합니다. 해당 기본 템플릿을 정의할 수 있습니다. 그러나 GCC의 동작은 이 표준에서 벗어납니다. 이러한 불일치는 네임스페이스 외부에서 선언된 명시적 특수화가 컴파일되지 않는 최신 버전의 GCC에서 관찰되었습니다.

이 문제를 설명하려면 다음 코드를 고려하세요.

template<typename T>
struct Widget
{
    template<typename U>
    void foo(U)
    {
    }

    template<>
    void foo(int*)
    {
    }
};
로그인 후 복사

이 동안 코드가 Clang에서 성공적으로 컴파일되면 GCC에서 오류가 발생합니다.

error: explicit specialization in non-namespace scope 'struct Widget<T>'
로그인 후 복사

이 오류는 네임스페이스가 아닌 범위에서 명시적 특수화를 명시적으로 허용하는 C 표준과 일치하지 않습니다. C 표준의 [temp.expl.spec] 단락 2에 따르면:

"해당 기본 템플릿이 정의될 수 있는 모든 범위에서 명시적 특수화를 선언할 수 있습니다."

이러한 표준 편차는 GCC의 잠재적인 버그를 구성합니다. 이 문제를 보고하려면 다음 단계를 따르세요.

  1. GCC 버그 추적기 웹사이트를 방문하세요: https://gcc.gnu.org/bugzilla/
  2. "새 보고서 만들기"를 클릭하세요.
  3. "새 보고서 제출" 메뉴에서 "버그 담당자" 선택
  4. 코드 조각, 오류 메시지 및 관련 C 표준 섹션에 대한 참조([temp .expl.spec]).
  5. 보고서를 제출하고 GCC 버전, 사용 중인 컴파일러 옵션 등 관련 정보를 제공하세요.

이 문제를 보고하면 귀하가 기여할 수 있습니다. GCC 개선에 기여하고 C 표준을 완전히 준수하는지 확인하세요.

위 내용은 GCC가 네임스페이스 외부의 명시적 전문화를 거부하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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