#c
#c
Вопрос:
Что-то не так с этим кодом C . Я скомпилировал его в VC 6.0. Выдает ошибку «не удается вывести аргумент шаблона для типа»… Проблема в display
функции.
Вот код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
template <class type>
struct one
{
type data;
one *next;
};
one<int> *head, *temp, *mid, *del = NULL;
template <class type>
void athead(type value)
{
one *node = new one;
node->data = value;
node->next = head;
head = node;
}
template <class type>
void add_at_tail(type value)
{
one *node = new one;
node->data = value;
node->next = NULL;
if(head == NULL)
{
head = node;
temp = head;
}
while(temp->next != NULL)
{
temp = temp->next;
}
if(temp != node)
{
temp->next = node;
}
}
template <class type>
void display()
{
one<type> *temp = new one;
temp = head;
cout << "nn" << endl;
while(temp != NULL)
{
cout << " " << temp->data << " " << "->";
temp = temp->next;
}
cout << "nnn";
}
int main()
{
int a, b, c;
cout << "Enter the data: " << endl;
cin >> a;
add_at_tail(a);
cout << "Enter the data: " << endl;
cin >> b;
add_at_tail(b);
cout << "Enter the data: " << endl;
cin >> c;
add_at_tail(c);
display();
return 0;
}
Комментарии:
1. Это похоже на домашнее задание. Так ли это?
Ответ №1:
Здесь, по крайней мере, пара проблем:
Во-первых, вы определили функцию шаблона:
template<class type>
void display()
{
one<type> *temp=new one;
temp=head;
cout<<"nn"<<endl;
while(temp!=NULL)
{
cout<<" "<<temp->data<<" "<<"->";
temp=temp->next;
}
cout<<"nnn";
}
Эта строка имеет неправильную форму, поскольку one
не является полным типом ( one
является шаблоном класса)
one<type> *temp=new one;
Вам нужно сделать это:
one<type> *temp=new one<type>;
Затем в клиентском коде вы пытаетесь вызвать шаблон функции следующим образом:
display();
Но display
это шаблон функции без аргументов, поэтому компилятор никак не может определить тип его параметра шаблона type
. Вы должны указать тип type
в точке вызова.
display<int>();
Также существуют логические ошибки при реализации display()
. Вы создаете экземпляр единственной копии one
и не инициализируете его. Затем вы пытаетесь выполнить итерацию по нему, как будто это связанный список, но это не так — это просто какой-то неинициализированный узел, который вы только что создали. Вероятно, вы хотите передать связанный список, по которому пытаетесь выполнить итерацию. Что-то в этом роде:
template<class type>
void display(const one<type>amp; head)
{
one<type> const * temp = amp;head;
cout<<"nn"<<endl;
while(temp!=NULL)
{
cout<<" "<<temp->data<<" "<<"->";
temp=temp->next;
}
cout<<"nnn";
}
Теперь, когда display
принимает параметры, упомянутые в шаблоне, компилятор может определить его тип. Вы, вероятно, хотите назвать это так:
display(head);
Ответ №2:
У вас есть вызов display()
, но это шаблонная функция, и вы не предоставили компилятору возможности вывести аргумент шаблона. Вы можете указать это явно как display<int>();
(но помимо этого в коде есть и другие проблемы — вы пишете one
в нескольких местах, когда, вероятно, должны были бы писать one<type>
).
Ответ №3:
Ну, поскольку display()
не принимает аргументов, как вы думаете, как компилятор может определить, к какому типу вы ожидаете, что он будет конкретизирован type
? Вы могли бы дать display()
аргумент фиктивного типа или, что еще лучше, переместить все эти методы в класс, чтобы параметр типа можно было определить только один раз для всей программы.
Ответ №4:
Замена one *node = new one;
на one<type>* node = new one<type>;
и изменение display();
в main()
на display<int>();
исправили все ошибки компилятора.