Từ Lambda function passed as parameter tôi có thể biên dịch ví dụ:tại sao mã này có C2784 "không thể suy ra mẫu đối số" lỗi
template <class Range>
Range FindFirstIf(Range, bool(*Function)(typename Range::ConstReference value));
struct range { using ConstReference = const float&; };
range rng;
rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); });
Tất nhiên nó không thể liên kết như FindFirstIf
không được thực hiện.
Tuy nhiên, khi tôi đã làm một điều tương tự:
template <class Range, class ValueType>
Range MyTest(Range, ValueType, bool(*Function)(ValueType value));
std::vector <int> vi;
double d = 0;
vi = MyTest(vi, d, [](double val) { return (val < 0.0f); });
Nó có lỗi biên dịch:
error C2784: 'Range MyTest(Range,ValueType,bool (__cdecl *)(ValueType))' : could not deduce template argument for 'bool (__cdecl *)(ValueType)' from 'main::'
tại sao như vậy? Tôi nghĩ rằng bằng cách vượt qua d
trong, ValueType
có thể được suy ra là double
?
Không chắc chắn nếu đó là vì các loại '[] (val kép) {return (val <0.0f); } 'không bằng' bool (* Hàm) (giá trị ValueType) '. Tôi đã có một câu hỏi tương tự trước đây, có lẽ bạn có thể kiểm tra nó ra. Ở đây http://stackoverflow.com/questions/24606517/why-cant-i-deduce-template-argument-for-this-function –
Nếu chúng là cùng một vấn đề, điểm mấu chốt là để suy ra 'ValueType', nó yêu cầu 'ValueType' và' bool (* Function) (ValueType value) 'vừa khớp, nhưng kiểu lambda có thể không khớp với' bool (* Function) (ValueType value) '(nghĩa là chúng có thể chuyển đổi, nhưng không bằng nhau) –
'vi = MyTest, double> (vi, d, [] (double val) {return (val <0.0f);});' sẽ hoạt động !! –
Praveen