2011-07-24 35 views
6

Tôi đang đọc Hướng dẫn hoàn chỉnh mẫu C++ và đã xem mã() và các phần khác ngoại trừ định nghĩa và gọi hàm):Thông số mẫu chức năng không kiểu

#include <vector> 
#include <algorithm> 
#include <iostream> 

template <typename T, int value> 
T add (T const & element){ 
    return element + value; 
} 

int main() { 
    int a[] = {1,2,3,4}; 
    int length = sizeof (a)/sizeof (*a); 
    int b[length]; 
    std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why? 
    std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; }); 
    return 0; 
} 

Tôi không hiểu sau khi đọc từ cuốn sách tại sao chúng ta cần typecasting của cuộc gọi chức năng?

EDIT: Giải thích từ cuốn sách:

add là một hàm template, và chức năng các mẫu được coi là đến tên một tập hợp các hàm quá tải (ngay cả khi các thiết lập chỉ có một thành viên). Tuy nhiên, theo tiêu chuẩn hiện hành, không thể sử dụng các tập chức năng quá tải để khấu trừ tham số mẫu. Vì vậy, bạn phải biến đổi thành kiểu chính xác của hàm template luận: ...

Compiler: g ++ 4.5.1 trên Ubuntu 10.10

Trả lời

6

Nói đúng ra, bạn không thể tham khảo các chuyên môn của một mẫu hàm bằng cách đơn giản đưa ra một danh sách đối số mẫu. Bạn luôn phải có một kiểu mục tiêu xung quanh (như, một kiểu tham số hàm mà bạn chuyển tới, hoặc một kiểu diễn viên mà bạn chọn, hoặc một kiểu biến mà bạn gán cho).

Đó là trường hợp ngay cả khi loại mục tiêu là hoàn toàn miễn phí các thông số mẫu, ví dụ

template<typename T> void f() { } 
template<typename T> void g(T) { } 

int main() { 
    g(f<int>); // not strictly valid in C++03 
    g((void(*)())f<int>); // valid in C++03 
} 

Ban added rules đã được thông qua vào C++ 0x và bởi trình biên dịch phổ biến ở họ C++ 03 chế độ làm cho nó có thể bỏ qua một loại mục tiêu nếu bạn cung cấp một danh sách đối số mẫu hoàn chỉnh cung cấp các kiểu cho tất cả các tham số mẫu, cùng với tất cả các đối số mẫu mặc định.

Các vấn đề liên quan