Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange "Could not deduce template argument for 'T'" error

The error is in this code:

//myutil.h
template <class T, class predicate>
T ConditionalInput(LPSTR inputMessage, LPSTR errorMessage, predicate condition);    

//myutil.cpp
template <class T, class Pred>
T ConditionalInput(LPSTR inputMessage, LPSTR errorMessage, Pred condition)
{
        T input
        cout<< inputMessage;
        cin>> input;
        while(!condition(input))
        {
                cout<< errorMessage;
                cin>> input;
        }
        return input;
}

...

//c_main.cpp 
int row;

row = ConditionalInput("Input the row of the number to lookup, row > 0: ",
"[INPUT ERROR]: Specified number is not contained in the range [row > 0]. "
"Please type again: ", [](int x){ return x > 0; });

The error is:

Error   1       error C2783: 'T ConditionalInput(LPSTR,LPSTR,predicate)' :
could not deduce template argument for 'T' c_main.cpp        17      1

I've been struggling with it for hours but can't seem to find a solution. I believe mistake might be trivial, but I couldn't find anyone else encountering the error under similar circumstances. Help much appreciated!

EDIT: Correction made by Frederik Slijkerman fixes one issue but creates another. This time the error is:

Error   1   error LNK2019: unresolved external symbol "int __cdecl ConditionalInput<int,class `anonymous namespace'::<lambda0> >(char *,char *,class `anonymous namespace'::<lambda0>)" (??$ConditionalInput@HV<lambda0>@?A0x109237b6@@@@YAHPAD0V<lambda0>@?A0x109237b6@@@Z) referenced in function _main

Please bear with me and help me solve this issue.

like image 214
Johnny Avatar asked Jul 24 '10 10:07

Johnny


2 Answers

C++ cannot deduce the return type of a function. It only works with its arguments. You have to explicitly call ConditionalInput<int>(...).

like image 115
Scharron Avatar answered Sep 18 '22 01:09

Scharron


Use

row = ConditionalInput<int>(...) 

to specify the return type explicitly.

like image 30
Frederik Slijkerman Avatar answered Sep 21 '22 01:09

Frederik Slijkerman