2010-07-24 11 views
5

Błąd w kodzie this:Strange „Nie można wywnioskować szablonu argumentu dla«T»” błąd

//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; }); 

błędu jest:

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

mam zmaga się z nim przez kilka godzin ale nie może znaleźć rozwiązania. Uważam, że błąd może być trywialny, ale nie mogłem znaleźć nikogo, kto spotkałby się z błędem w podobnych okolicznościach. Pomoc bardzo doceniona!

EDYCJA: Korekta dokonana przez Frederika Slijkermana rozwiązuje jeden problem, ale tworzy kolejny. Tym razem błąd jest następujący:

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

Proszę znieść mnie i pomóż mi rozwiązać ten problem.

Odpowiedz

6

C++ nie może wywnioskować typu zwracanego przez funkcję. Działa tylko z jej argumentami. Musisz jednoznacznie zadzwonić pod numer ConditionalInput<int>(...).

+0

Edytowane, ponieważ <> należy zastąpić lt/gt. – Scharron

+0

Prawidłowa odpowiedź w komentarzach odpowiedzi powyżej. Chociaż ten użytkownik ma za to kredyty. – Johnny

3

Zastosowanie

row = ConditionalInput<int>(...) 

określić typ zwracanej wyraźnie.

+0

nie mam określić drugi typ szablonu? – Johnny

+1

Nie trzeba, dedukcja działa dla argumentów. – Scharron

+0

Po tym mam kolejny błąd, ten daje mi jeszcze większy ból głowy. to jest tak: Błąd błąd LNK2019: nierozwiązany symbol zewnętrzny "int __cdecl ConditionalInput > (char *, char *, klasa 'anonimowy obszar nazw' :: )" (?? $ ConditionalInput @ HV @? A0x109237b6 @@@@ YAHPAD0V @? A0x109237b6 @@@ Z) wymieniony w funkcji _main \t C: \ Users \ CodeMaster \ documents \ visual studio 2010 \ Projects \ Challenge8 - Paskal Triangle \ Challenge8 - Paskal Triangle \ c_main.obj \t Wyzwanie8 - Paskal Trójkąt – Johnny

0

Zauważyłem, że musisz najpierw określić typ powrotu, jeśli musi on być jawnie nazwany jako Conditional<int>(...).

template <class T, class A> 
T function (A) { ... } 

natomiast dodaje przyniesie skompilować błędy:

template <class A, class T> 
T function (A) { ... } 
Powiązane problemy