template<class T, T i> void f(int[10][i]) { }; int main() { int a[10][30]; f(a); }
Почему f(a) терпит неудачу?
f(a)
http://ideone.com/Rkc1Z
Попробуйте:
template<class T, T i> void f(T[10][i]) { }; // note the 'T' int main() { int a[10][30]; f(a); }
.. это позволяет компилятору определить тип T, что совершенно невозможно в вашем примере (поскольку T вообще не используется).
T
http://ideone.com/gyQqI
f(a) терпит неудачу, потому что аргумент типа шаблона не может быть выведен из типа нетипичного аргумента.В этом случае компилятор не может определить тип параметра шаблона T.
Попробуйте вызвать его как f<int>(a);
f<int>(a);
template< std::size_t N > void f(int (&arr)[10][N]) { } int main() { int a[10][30]; f(a); }
Это работает (http://codepad.org/iXeqanLJ)
Полезное описание: Разрешение перегрузки и массивы: какую функцию следует вызывать?