(다중) 파생 클래스를 기본 클래스를 예상하는 템플릿 함수에 전달할 때 템플릿 인스턴스화 규칙은 무엇입니까? 예를 들면 : - 1 6.2 GCC 컴파일러 에러 (Demo)를 제공여러 템플릿 상속을 사용한 템플릿 인스턴스화
#include <iostream>
template <int x>
struct C {};
struct D : C<0>, C<1> {};
template <int x>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
MSVC 2,015 인쇄 0 3.8 연타. 심지어 SFINAE - 멀리 모든 오버로드를 제외한 당신이 경우에, 결과는 여전히 다를 것이다 :
#include <iostream>
template <int x> struct C {};
template<>
struct C<0> { using type = void; };
struct D : C<0>, C<1> {};
template <int x, typename = typename C<x>::type>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
가 지금은 MSVC로 컴파일하고 C<0>
및 C<1>
를 교환 할 경우에만 그 소리가 컴파일됩니다. 문제는 MSVC가 첫 번째 기본, clang - last 및 gcc 오류를 너무 일찍 인스턴스화하려고 시도한다는 것입니다. 어느 컴파일러가 옳은가?
나는 마치 그들이 모두 잘못되었다고 생각합니다. 모호한 함수 호출이 아니어야합니까? –
* "MSVC는 0, clang - 1을 출력하고 gcc는 컴파일러 오류를 발생시킵니다."*, 어느 MSVC, 어느 gcc와 어느 clang? –
@PiotrSkotnicki 버전 번호를 추가했지만 모두 동일하게 동작합니다. –