шаблоны c , реализующие на структурах

#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>(); исправили все ошибки компилятора.