최소 프로그램 :동일한 서명으로 템플릿 함수에 오버로드가 발생하는 이유는 무엇입니까?
이#include <stdio.h>
#include <type_traits>
template<typename S, typename T>
int foo(typename T::type s) {
return 1;
}
template<typename S, typename T>
int foo(S s) {
return 2;
}
int main(int argc, char* argv[]) {
int x = 3;
printf("%d\n", foo<int, std::enable_if<true, int>>(x));
return 0;
}
출력 :
1
왜이 컴파일 에러를 제공하지 않습니다? 템플릿 코드가 생성되면 int foo(typename T::type search)
과 int foo(S& search)
함수의 서명이 같지 않습니까? 템플릿 기능이 조금, 여전히 (내가 위의 예 주어진 기대하는 것처럼) 작동 시그니처 변경하는 경우
: 아직
template<typename S, typename T>
void foo(typename T::type s) {
printf("a\n");
}
template<typename S, typename T>
void foo(S s) {
printf("b\n");
}
를이 없습니다 아직 유일한 차이점은 하나는 가지고 있다는 것입니다 않습니다 int 시그니처와 다른 것은 최초의 템플릿 파라미터로 정의됩니다.
template<typename S, typename T>
void foo(typename T::type s) {
printf("a\n");
}
template<typename S, typename T>
void foo(int s) {
printf("b\n");
}
컴파일러 오류 (연타) :
test.cpp:26:2: error: call to 'foo' is ambiguous
foo<std::enable_if<true, int>>(3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:16:6: note: candidate function [with T = std::__1::enable_if<true, int>]
void foo(typename T::type s) {
^
test.cpp:21:6: note: candidate function [with T = std::__1::enable_if<true, int>]
void foo(int s) {
^
1 error generated.
내가 일하고 있어요 프로젝트에 대한이 유사한 코드를 사용하고
내가 미묘 언어에가 있다는 것을 두려워하는 I 어떤 경우에는 정의되지 않은 행동을 일으키는 것을 이해하지 못합니다. 또한 Clang과 VS11에서 모두 컴파일되므로 컴파일러 버그라고 생각하지 않습니다.
편집 : 수정 된 두 번째 경우 (오타); Clang에서 오류 메시지를 추가했습니다.
편집 # 2 : T :: type의 의미를 묻는 질문에 대한 답변입니다. http://en.cppreference.com/w/cpp/types/enable_if 가입일
:
템플릿 < 부울 B 클래스 T = 무효> 구조체 enable_if;
B가 참인 경우 std :: enable_if는 public member typedef 유형을가집니다. to T; 그렇지 않으면 typedef 멤버가 없습니다.
enable_if는 구조체입니다. 기본적으로 enable_if의 첫 번째 템플릿 매개 변수에서 평가 된 표현식이 참이면 (위 예제의 경우), 두 번째 템플릿 매개 변수와 동일한 유형을 갖는 public 멤버 type
이 있습니다.
enable_if<true, int>
의 경우 enable_if :: type의 유형은 int입니다.
마지막 사례가 컴파일되지 않는 것은 놀라운 일이 아닙니다. 함수가 하나만 받으면 두 개의 템플릿 인수를 사용합니다. –
고마워, 거기에 잘못된 경우를 복사 한 것 같아. 결정된. – vmrob
저는 C++ 멍청한 녀석입니다. 가혹하지 않습니다 ... 첫 번째 예제를 재정의했기 때문에 첫 번째 예제가 작동하지 않습니까? 나는 이것에 대한 답을 알고 싶다. 내년에 C++을 배울 계획입니다. –