2016-06-06 3 views
9

아래의 최소 예제는 gcc와 clang 및 Visual Studio에서도 작동하지만 icc에서는 컴파일되지 않는다는 것을 발견했습니다. 이 C++의 유효성 여부를 확인하려고하지만 여러 다른 개념이 결합되어 있으므로 내 질문에 대답하는 표준 관련 부분을 찾을 수 없습니다.가변 템플릿 템플릿 매개 변수에 기본 템플릿 매개 변수 사용

struct.cpp(12): error: too few arguments for template template parameter "F" 
    F<D> h; 

      detected during instantiation of class "G<D, F> [with D=char, F=C]" at line 17 

이 유효한 C++인가 : ICC (16.0.3)와

// struct with multiple template parameters 
template<typename A, typename B = int> 
struct C 
{ 

}; 

// struct that tries to use C's default second parameter without specifying it 
template<typename D, template<typename E, typename ...> class F> 
struct G 
{ 
    F<D> h; 
}; 

int main() 
{ 
    G<char, C> i; 
} 

는, 컴파일은 다음과 같은 오류를 준다?

C에는 F<D>F = C이 유효한 구조 여야한다는 의미에서 두 번째 템플릿 매개 변수의 기본값이 있으므로 내게 그렇게 보일 것 같습니다.

+0

가능한 중복이 필요합니다 템플릿 템플릿 매개 변수를 사용할 때 기본 매개 변수를 명시 적으로 나열 하시겠습니까?] (http://stackoverflow.com/q/24017466/27678) – AndyG

+0

'template class F' 템플릿을 사용해 보셨습니까? – Yakk

+0

@Yakk : 그럴 수 없습니다. 불행히도 문제를 해결하십시오. – ryan

답변

4

저는 이것이 gcc/clang 버그라고 생각합니다. 이것은 [열림] CWG Issue 150과 관련이 있습니다. 제공하는 근거는 다음과 같습니다

Default arguments are allowed for the parameters of a template template parameter, and those default arguments alone will be considered in a specialization of the template template parameter within a template definition; any default arguments for the parameters of a template template argument are ignored.

템플릿 템플릿 매개 변수 F은 기본 인수를하지 않습니다 - 그리고 C에 대한 기본 인수는 무시됩니다. 따라서 우리는 ICC가 제안한 것처럼 형편없는 전문화로 끝나야합니다. 문제, GCC와 그 소리에 모두 제공되는 예에서

f()에 대한 호출이 허용 (도 규칙을 구현하는 것 모두 마크 미첼의 예에서 operator float() 경로를 통해 이동합니다. [의

+0

CWG-150 링크를 이용해 주셔서 감사합니다. 중요한 차이점은 variadic 템플릿 매개 변수가 있다는 것입니다. 따라서이 상황에서는 'B = int'의 기본 템플릿 매개 변수를 사용하여 가변 길이 템플릿 매개 변수 목록을 길이 0으로 가질 수 있습니다. 이것은 gcc와 clang이하는 것처럼 보이지만 icc는 아닙니다. 그러나 CWG-150에서 언급 된 문제는 variadic 템플리트 매개 변수 목록을 제거하고'typename ... '대신'typename'으로 바꾸는 경우에만 적용됩니다. – ryan

+0

@ryan이 문제는 C++ 11보다 훨씬 앞서서 가변적 인 템플릿을 언급하지 않습니다. 그러나 궁극적으로는 같은 개념입니다. – Barry

+0

Sad : 왜 그들이 처음에 템플릿 템플릿 arg defaults를 적용 할 수 없는지, 그리고 소스 템플릿의 기본 args를 생각해 볼 수 있습니까? – Yakk