Странная ошибка «Не удалось вывести аргумент шаблона для« T »» - PullRequest
6 голосов
/ 24 июля 2010

Ошибка в этом коде:

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

Ошибка:

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

Я боролся с этим часами, но могу 'Кажется, я не нашел решения.Я считаю, что ошибка может быть тривиальной, но я не мог найти кого-то еще, кто сталкивался бы с ошибкой при подобных обстоятельствах.Помощь очень ценится!

РЕДАКТИРОВАТЬ: Исправление, внесенное Фредериком Слайкерманом, исправляет одну проблему, но создает другую.На этот раз ошибка:

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

Пожалуйста, потерпите меня и помогите мне решить эту проблему.

Ответы [ 3 ]

6 голосов
/ 24 июля 2010

C ++ не может определить тип возвращаемого значения функции. Работает только со своими аргументами. Вы должны явно позвонить ConditionalInput<int>(...).

3 голосов
/ 24 июля 2010

Используйте

row = ConditionalInput<int>(...) 

, чтобы явно указать тип возвращаемого значения.

0 голосов
/ 24 апреля 2014

Я заметил, что вам также нужно сначала указать тип возвращаемого значения, если он должен явно вызываться как Conditional<int>(...).

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

, тогда как следующие приведут к ошибкам компиляции:

template <class A, class T>
T function (A) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...