#c #templates #stl #typename
#c #шаблоны #stl #имя типа
Вопрос:
Я не знаю, как заставить использовать более одной клиентской функции в программе с шаблоном, я могу выполнить одну функцию и заставить ее работать, но когда дело доходит до более чем одной, и я пытаюсь использовать две или более, это выдает мне ошибки, подобные этой:
|17|error: 'T' was not declared in this scope|
|17|error: template argument 1 is invalid|
|17|error: template argument 2 is invalid|
|18|error: 'T' was not declared in this scope|
|18|error: template argument 1 is invalid|
|18|error: template argument 2 is invalid|
||In function 'int main()':|
|72|error: invalid initialization of reference of type 'intamp;' from expression of type 'std::queue<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::deque<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >'|
|17|error: in passing argument 1 of 'void print_queue(intamp;)'|
|73|error: invalid initialization of reference of type 'intamp;' from expression of type 'std::stack<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::deque<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >'|
|18|error: in passing argument 1 of 'void print_stack(intamp;)'|
|25|warning: unused variable 'pos'|
||=== Build finished: 10 errors, 1 warnings ===|
#include <iostream>
using namespace std;
#include <list>
#include <queue>
#include <stack>
template <typename T>
void print_list(list<T> amp;); // prototype for client function
void print_queue(queue<T> amp;); // prototype for client function
void print_stack(stack<T> amp;); // prototype for client function
int main()
{
list< string > lst;
queue< string > package, package_temp;
stack< string > box, box_temp;
string::size_type pos;
string choice, str;
bool choice_flag = true;
do{
cin >> choice;
if(choice == "QUIT"){
choice_flag = false;
break;
}
else{
lst.push_back(choice);
}
}while(choice_flag);
print_list(lst);
cout << endl;
while(!lst.empty()){
str = lst.front();
if(str.find('P',0))
box.push(str);
else
package.push(str);
lst.pop_front();
}
print_queue(package);
print_stack(box);
return 0;
}
// client (not primitive) function to print each item on list lst
template <typename T>
void print_list(list<T> amp;lst)
{
list<T> temp;
T x;
cout << "The elements on the list are: " << endl;
while (!lst.empty()) {
x = lst.front();
lst.pop_front();
cout << x << endl;
temp.push_back(x);
}
while (!temp.empty()) {
x = temp.front();
temp.pop_front();
lst.push_back(x);
}
return;
}
// client (not primitive) function to print each item on queue package
template <typename T>
void print_queue(queue<T1> amp;package)
{
queue<T1> temp;
T1 x;
cout << "The elements on the list are: " << endl;
while (!package.empty()) {
x = package.front();
package.pop();
cout << x << endl;
temp.push(x);
}
while (!temp.empty()) {
x = temp.front();
temp.pop();
package.push(x);
}
return;
}
Комментарии:
1. Возможно, начните с хорошей книги по C , чтобы изучить основы шаблонов.
2. Я предполагаю, что вы хотите сделать больше, чем просто распечатать список / очередь, или нет причин извлекать значения, помещать их во временный список и снова добавлять их обратно в основной список.
3. да, со списком печати / очередью нужно сделать гораздо больше, это только часть этого
4. @KerrekSB Я посмотрел в книге, которая у меня есть, но в ней ничего не было о шаблонах, и в примерах Я не смог найти в Интернете примеров, в которых упоминается, как объявлять template<…> с использованием более чем одной клиентской функции
Ответ №1:
У вас должно быть template<...>
выше каждой шаблонной функции, которую вы пишете. Вы забыли это над print_queue
функцией, поэтому просто добавьте template<typename T>
над ней, и это должно решить проблему.
Вы также не #include
определили string
заголовок, который вам нужно сделать для использования std::string
.
Комментарии:
1. ИЗВИНИТЕ, эти ошибки — это ошибки, которые я получил с шаблоном<…>, включенным над каждой функцией
2. @123me вы также пропускаете это над прототипами.