Question

I have a template method as follows:-

template<typename T, int length>
void ProcessArray(T array[length]) { ... }

And then I have code using the above method:-

int numbers[10] = { ... };
ProcessArray<int, 10>(numbers);

My question is why do I have to specify the template arguments explicitly. Can't it be auto-deduced so that I can use as follows:-

ProcessArray(numbers); // without all the explicit type specification ceremony

I am sure I am missing something basic! Spare a hammer!

Was it helpful?

Solution

You can't pass arrays by value. In a function parameter T array[length] is exactly the same as T* array. There is no length information available to be deduced.

If you want to take an array by value, you need something like std::array. Otherwise, you can take it by reference, which doesn't lose the size information:

template<typename T, int length>
void ProcessArray(T (&array)[length]) { ... }

OTHER TIPS

You're missing the correct argument type: arrays can only be passed by reference:

template <typename T, unsigned int N>
void process_array(T (&arr)[N])
{
    // arr[1] = 9;
}

double foo[12];
process_array(foo); // fine
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top