Tôi đã cố gắng để biên dịch một dự án (mà là tốt bằng cách sử dụng gcc/g + +) với tiếng kêu và biên dịch bị mắc kẹt trên một lời gọi mẫu. Tôi đã cố tạo một đoạn mã tương tự đơn giản nhất có cùng thông báo lỗi. Ở đây là:Clang "không thể suy luận đối số mẫu" trong khi gcc/g ++ có thể. Cái nào đúng?
#include <vector>
#include <utility>
#include <iostream>
using namespace std;
int A(double in)
{
return 1;
}
int A(int in)
{
return 1;
}
template<class M, class T>
M test(T input, M (fun) (T))
{
return fun(input);
}
int main(int argc, const char *argv[])
{
cout << test((int) 1, A) << test((double) 1.2, A) << endl;
return 0;
}
Các lỗi từ kêu vang (xuất hiện hai lần tất nhiên):
error: no matching function for call to 'test'
candidate template ignored: couldn't infer template argument 'M'
Gcc không phàn nàn. Xin lưu ý M là kiểu trả về và luôn là "int".
Có ai đó biết điều gì đúng và lý do không?
Cảm ơn
bạn có thử dùng (..., & A) thay thế không? –
Stefano: Tôi đã thử, nó không có sự khác biệt. – Max
Và nó không nên. Không cần sử dụng toán tử địa chỉ trên tên hàm để lấy con trỏ hàm. (Và tương tự, không cần phải rõ ràng dereference một con trỏ chức năng với '*' để gọi nó.) Mặc dù bạn có thể nếu bạn thực sự muốn, nhưng nó làm cho không có sự khác biệt. – BoBTFish