2012-06-24 29 views
9

Tôi có một phương pháp mẫu như sau: -Mảng loại trừ trong một hàm template

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

Và sau đó tôi có mã bằng cách sử dụng phương pháp trên: -

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

Câu hỏi của tôi là tại sao tôi phải chỉ định các đối số mẫu một cách rõ ràng. Không thể tự động suy luận để tôi có thể sử dụng như sau: -

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

Tôi chắc chắn mình thiếu một số thứ cơ bản! Hãy dành một cái búa!

Trả lời

13

Bạn không thể chuyển mảng theo giá trị. Trong tham số chức năng T array[length]giống hệt nhauT* array. Không có thông tin về độ dài có sẵn để được suy luận.

Nếu bạn muốn lấy một mảng theo giá trị, bạn cần một cái gì đó như std::array. Nếu không, bạn có thể mang nó bằng cách tham khảo, mà không bị mất những thông tin kích thước:

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

Bạn đang thiếu các loại lập luận chính xác: mảng chỉ có thể được thông qua bởi tham khảo:

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

double foo[12]; 
process_array(foo); // fine 
Các vấn đề liên quan