ИМХО, что попытка ОП не была такой удачной.
Я пытаюсь разобраться:
template <class prompt> prompt(string prompt_question)
Это сломано. Идентификатор функции отсутствует. Или, может быть, возвращаемый тип функции отсутствует, но тогда имя функции совпадает с идентификатором параметра шаблона.
prompt_question = answer;
? Для чего это будет хорошо? answer
не объявлено в этой области и не инициализировано. Почему prompt_question
должно быть заменено этим?
answer = "What is the answer?
? Для чего это будет хорошо?
misc = answer;
? Для чего это будет хорошо? misc
не объявлено в этой области.
Мой рабочий пример, чтобы показать, как это может выглядеть:
#include <cassert>
#include <iostream>
struct Answers {
std::string name;
float answer;
int misc;
};
template <class T>
void prompt(const std::string &question, T &answer)
{
std::cout << question;
std::cin >> answer;
}
int main()
{
Answers info { };
prompt("Who: ", info.name);
if (!std::cin) { std::cerr << "Input failed!\n"; return -1; }
prompt("Age: ", info.answer);
if (!std::cin) { std::cerr << "Input failed!\n"; return -1; }
std::cout << "\nYou claim to be " << info.name << " with an age of " << info.answer << ".\n";
}
Вывод:
Who: Just
Age: 34
You claim to be Just with an age of 34.
Демонстрация в реальном времени на coliru
После редактирования кажется, что OP требует, чтобы параметр шаблона имел тип возвращаемого значения:
#include <cassert>
#include <iostream>
struct Answers {
std::string name;
float answer;
int misc;
};
template <class T>
T prompt(const std::string &question)
{
std::cout << question;
T answer;
std::cin >> answer;
return answer;
}
int main(int argc, char **argv)
{
Answers info {
prompt<std::string>("Who: "),
prompt<float>("Age: ")
};
if (!std::cin) { std::cerr << "Input failed!\n"; return -1; }
std::cout << "\nYou claim to be " << info.name << " with an age of " << info.answer << ".\n";
}
Вывод:
Who: Just
Age: 34
You claim to be Just with an age of 34.
Живая демоверсия на coliru
Сравнивая первый и второй подход, вы заметите конструктивную слабостьвторое:
Хотя в первом подходе тип может быть определен компилятором, это невозможно во втором. Единственным отличием экземпляров шаблона второй template
функции prompt()
будет тип возвращаемого значения - не выводимый для компилятора. Следовательно, вторая шаблонная функция должна использоваться всегда с явным параметром шаблона (который предоставляет другую возможность сделать что-то не так).
Общая рекомендация:
Когда вы пытаетесь написатьtemplate
функция, и вы не уверены в шаблонах, затем начинаете с простой функции, а typedef
для типа, который должен стать параметром шаблона:
typedef std::string T;
void prompt(const std::string &question, T &answer)
{
std::cout << question;
std::cin >> answer;
}
Компиляция, тестирование, восхищение, готово.
Теперь его можно превратить в функцию шаблона:
//typedef std::string T; // obsolete
template <class T>
void prompt(const std::string &question, T &answer)
{
std::cout << question;
std::cin >> answer;
}
Компиляция, тестирование, восхищение, готово.