내가 작성한 내용이 합법적인지 여부를 판단하려고합니다. 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의 문제입니다 + +?
https://connect.microsoft.com/VisualStudio – SoronelHaetir
에서 물어볼 수 있습니다. 실제로 이것이 합법적 인 C++ 14이고 컴파일해야한다고 생각되면, 나는 그렇게 할 것입니다. – kmhofmann
저는 여러분의 문제가 세 번째 경우와 아무 관련이 없으며 처음 두 가지는 줄일 수 있다고 확신합니다. 왜 [mcve]를 제공하지 않습니까? –