2
생성자에서 템플릿 차감을 허용하는 새로운 C++ 17 기능의 모든 제한 사항을 이해하는 데 어려움을 겪고 있습니다. 특히부분 특수화로 클래스 템플릿 인수 차감
,이 예는 제대로 컴파일합니다 :
struct B {};
template <typename T, typename = T>
struct A {
A(T) {}
};
int main() {
B b;
A a(b); // ok
}
이 하나가되지 않지만 :
이struct B {};
template <typename T, typename = T>
struct A;
template <typename T>
struct A<T> {
A(T) {}
};
int main() {
B b;
A a(b); // error
}
이 두 번째 경우의 오류는 다음과 같습니다
main.cpp: In function ‘int main()’:
main.cpp:17:14: error: class template argument deduction failed:
A a(b);
^
main.cpp:17:14: error: no matching function for call to ‘A(B&)’
main.cpp:4:12: note: candidate: template<class T, class> A(A<T, <template-parameter-1-2> >)-> A<T, <template-parameter-1-2> >
struct A;
^
main.cpp:4:12: note: template argument deduction/substitution failed:
main.cpp:17:14: note: ‘B’ is not derived from ‘A<T, <template-parameter-1-2> >’
A a(b);
^
은 왜이다 사고?