Tôi có đoạn mã sau:Tại sao tôi cần xác định loại đối số mẫu của một hàm mẫu ở đây?
template <typename T>
void f1(T t)
{
std::cout << "f1(" << t << ") called." << endl;
}
template <typename T>
void f2(T t)
{
std::cout << "f2(" << t << ") called." << endl;
}
template <typename F, typename T>
void call(F && f, T t)
{
f(t);
}
template <typename T>
void foo(T t)
{
call(f1<T>, t); // Why is <T> necessary?
// f1(t) is a valid expression!
call(f2<T>, t);
}
void bar()
{
foo(1);
}
Trong chức năng foo()
tôi cần phải xác định mẫu tranh luận, mặc dù f1(t)
là một biểu thức hợp lệ. Đó là kinda phá hủy một số khả năng trong mã của tôi. Câu hỏi của tôi:
- Tại sao tôi cần chỉ định đối số mẫu?
- Tôi làm cách nào để khắc phục giới hạn đó? (Cho phép C++ 11 hoặc C++ 14).
(BTW: Tôi hiện đang sử dụng Visual Studio 2010 và tôi nhận được lỗi C2896, nếu tôi rời khỏi <T>
ra.)
Chắc chắn 'f1 (t)' là một biểu thức hợp lệ bên trong 'foo()'. Nó biên dịch tốt. –
Trích tham số mẫu không hoạt động theo các mẫu cụ thể, có lẽ điều này trả lời câu hỏi của bạn: http://stackoverflow.com/questions/1268504/why-is-the-template-argument-deduction-not-working-here – urzeit
@RalphTandetzky: Nó không quan trọng những gì * có thể * là một biểu thức hợp lệ vì nó được sử dụng bên trong 'foo'. Các mẫu là * không phải macro *; họ không chỉ mất bất cứ điều gì và dán các thẻ với nhau sau đó. Hàm mẫu của bạn có 'F && f'. Đó là một tham số hàm; nó phải là * giá trị *, có * loại *. Các mẫu không phải là các giá trị cũng không có các loại. Vì vậy, chúng không thể được chuyển thành các tham số hàm. –