2017-12-28 36 views
2

내가 작성한 내용이 합법적인지 여부를 판단하려고합니다. C++ 14 w.r.t. 모호하지 않은 함수 템플릿 과부하 해결.함수 템플릿 오버로드 확인이 Visual C++에서 실패 함 2017

내 의견으로는, 아래 프로그램은 컴파일해야하며 3을 반환해야합니다.

다양한 버전의 Clang과 GCC가 컴파일시 (-std=c++14 -O2 사용) 컴파일되지만 Visual C++ 2017 (버전 15.5.2, 작성 당시 최신 업데이트)에서는 아래 오류 메시지가 표시됩니다.

enum class Enum0 { State }; 
enum class Enum1 { State }; 

template <Enum0 Param0 = Enum0::State> 
int get() 
{ 
    return 1; 
} 

template <Enum1 Param1> 
int get() 
{ 
    return 2; 
} 

int main() 
{ 
    int sum = 0; 
    sum += get(); // should call instantiation of first function template 
    sum += get<Enum1::State>(); // should call instantiation of second function template 
    return sum; 
} 

이것은 비주얼 C에 의해 방출 된 오류 메시지 ++ 컴파일러 :

20 : <source>(20): error C2668: 'get': ambiguous call to overloaded function 
11 : <source>(11): note: could be 'int get<Enum1::State>(void)' 
5 : <source>(5): note: or  'int get<Enum0::State>(void)' 
20 : <source>(20): note: while trying to match the argument list '()' 

가 (질문을 편집하기 전에 이전 코드 예제 및 https://godbolt.org/g/BVEv79) 라이브 데모에 대한 https://godbolt.org/g/PhH2VY를 참조하십시오. 컴파일러를 MVSC로 변경하여 컴파일이 실패했는지 확인하십시오. GCC와 Clang은 어떤 문제도 나타내지 않습니다. 모두 잘 다음 86 조립 방출 :

 mov  eax, 3 
     ret 

는 GCC와 연타가 너무 관대를, 또는이 비주얼 C의 문제입니다 + +?

+0

https://connect.microsoft.com/VisualStudio – SoronelHaetir

+0

에서 물어볼 수 있습니다. 실제로 이것이 합법적 인 C++ 14이고 컴파일해야한다고 생각되면, 나는 그렇게 할 것입니다. – kmhofmann

+0

저는 여러분의 문제가 세 번째 경우와 아무 관련이 없으며 처음 두 가지는 줄일 수 있다고 확신합니다. 왜 [mcve]를 제공하지 않습니까? –

답변

0

그건 좋은 질문입니다. 그렇지 않습니다. 내가 함께 얻을 수있는 두 번째 전화를 변경하는 경우 : ...

sum += get<Enum1::State, int>(0.0); // should call instantiation of second function template 

... 다음 컴파일

공지 사항을, 나는 두 번째 템플릿 인수를 추가합니다. 일상 생활에서 MFC와 호환되는 오래된 C++ 방언을 사용합니다 ... 그래서 추론을 소금 한알로합니다. 그러나 템플릿에 하나의 인수 만 제공하고 두 번째 템플릿에는 두 개의 인수가 필요하기 때문에 VC++ 컴파일러는 기본 인수가 있고 단 하나의 인수 만 사용할 수 있기 때문에 첫 번째 템플릿을 사용하려고합니다. 따라서 템플릿을 선택하지만 Enum1에서 Enum0로 변환 할 수는 없습니다.

+0

그럴 수도 있습니다 만, 이런 종류의 API (모든 실제 코드와이 장난감 예제에서)의 모든 요점은 모든 템플릿 매개 변수를 타이핑하지 않아도되고 하나 또는 둘 다를 사용할 수 있어야합니다. 양자 모두. 다시 'Enum0'과 'Enum1'은 구별 유형이므로 인수 공제/과부하 해결 중에 모호하지 않아야합니다. – kmhofmann

관련 문제