template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
std::size_t대신 사용해야 합니다 int.
여기로 달려
편집 :
실제로, 귀하의 의견과 코드에 대한 나의 직감으로 인해 주제를 파헤 쳤습니다. 언뜻보기에, 표준 개발자 (나 같은)는 컴파일러 int가 std::size_t(완전한 유형이고 암시 적으로 변환하는 것이 매우 간단하기 때문에 ) 컴파일러가 변환 void foo(std::vector<std::array<T1, SIZE>> bar)하고 최고의 전문화로 선택하기 를 기대합니다. 따라서 템플릿 인수 공제 페이지 를 읽는 동안 나는 이것을 발견했습니다.
비 유형 템플릿 매개 변수가 매개 변수 목록에 사용되고 해당 템플릿 인수가 추론되는 경우 추론 된 템플릿 인수의 유형 (포함 템플릿 매개 변수 목록에 지정된 참조는 유지됨)이 cv-qualifiers가 삭제되고 템플리트 인수가 배열 바운드에서 추론되는 경우를 제외하고는 형식이 아닌 템플리트 매개 변수가 정확합니다.이 경우 항상 일체형이 허용되지만 부울 한 유형도 허용됩니다.
항상 그렇듯이, 당신은 그것이 무엇을 의미하는지 이해하기 위해 몇 번 이상 읽어야합니다 :)
흥미로운 결과가 나옵니다.
우리가 원하는 전문화는 이미 선택되어 있지 않지만 컴파일러가 강제로 선택했다면 오류가 발생합니다.
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo(b); // P = std::vector<std::array<int,(int)SIZE>
// A = std::vector<std::array<int,(unsigned_long)SIZE>>
// error: deduced non-type template argument does not have the same
// type as its corresponding template argument */
}
코드를 실행
또 다른 흥미로운 것은 :
비 타입 템플릿 인자가 추론되지 않았다면, 인자와 템플릿 타입을 동일하게 강제하는 제한은 없습니다.
#include <vector>
#include <array>
#include <iostream>
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo<int,3>(b);
}
코드를 실행
vector로 모든 것을 바깥쪽으로 제거하여이를 단순화 할 수 있습니다 . 참조