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-квалификаторы отбрасываются, и кроме случаев, когда аргумент шаблона выводится из границы массива - в этом случае допускается любой целочисленный тип, даже bool, хотя он всегда становится истинным:
Как всегда, конечно, вы должны прочитать несколько раз, чем один раз, чтобы понять, что это значит :)
Получается интересный результат.
Наша желаемая специализация уже не выбрана, но если бы компилятор был вынужден выбирать, это было бы ошибкой.
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
на всех из них. Смотрите здесь