>백엔드 개발 >C++ >C 이니셜라이저 목록에서 템플릿 생성자를 명시적으로 호출할 수 없는 이유는 무엇입니까?

C 이니셜라이저 목록에서 템플릿 생성자를 명시적으로 호출할 수 없는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-29 15:12:111057검색

Why Can't I Explicitly Invoke Template Constructors in C   Initializer Lists?

초기화 목록에서 템플릿 생성자의 명시적 호출

C에서는 초기화 목록 내에서 템플릿 생성자를 명시적으로 호출하는 것이 불가능합니다. 다음 예를 고려하십시오.

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};

C 표준은 생성자 멤버 함수 템플릿에 대한 명시적 템플릿 인수 목록을 명시적으로 허용하지 않으므로 이 코드는 컴파일에 실패합니다. 이는 함수 이름이 없는 생성자의 고유한 구문 때문입니다.

설명: C 표준은 섹션 14.8.1/7에 명시되어 있습니다.

"명시적인 템플릿 인수 목록은 함수 템플릿 이름을 따르기 때문에 변환 멤버 함수 템플릿과 생성자 멤버 함수 템플릿은 함수 이름을 사용하지 않고 호출되기 때문에 명시적인 템플릿 인수 목록을 제공할 방법이 없습니다. 이러한 함수 템플릿에 대한 템플릿 인수 목록입니다."

해결 방법: 초기화 목록 내에서 템플릿 생성자의 명시적인 호출이 필요한 경우 생성자와 함께 사용자 지정 유형을 사용하여 해결 방법을 사용할 수 있습니다. 템플릿 매개변수를 인수로 받아들이는 경우:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};

이 경우 Boost 라이브러리의 ID 유형 또는 C의 std::type_identity 20은 템플릿 매개변수 유형을 나타내는 데 사용될 수 있습니다. 이를 통해 이 사용자 정의 유형의 객체를 사용하여 템플릿 생성자를 간접적으로 호출할 수 있습니다.

위 내용은 C 이니셜라이저 목록에서 템플릿 생성자를 명시적으로 호출할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.