2011-04-29 2 views
0

이 C++ 코드에 문제가 있습니다. VC++ 6.0에서 컴파일했습니다. "형식에 대한 템플릿 인수를 추론 할 수 없습니다"라는 오류 메시지가 나타납니다. 문제는 display 함수에 있습니다.구조체에 구현 된 C++ 템플릿

여기에 코드입니다 : 당신은 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 << "\n\n" << endl; 
    while(temp != NULL) 
    { 
    cout << " " << temp->data << " " << "->"; 
    temp = temp->next; 
    } 
    cout << "\n\n\n"; 
} 

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; 
} 
+0

이것은 숙제와 같습니다. 그렇지? –

답변

0

하지만 템플릿 기능 그리고 당신은 컴파일러가 템플릿 인수를 추론 할 수있는 방법을 제공하지했습니다. 이 코드를 명시 적으로 display<int>();으로 지정할 수 있습니다 (코드에는 을 몇 군데에 쓰고 있는데 그 중에는 one<type>을 작성해야 할 때가 있습니다).

0

글쎄, display()은 아무런 인자도 없기 때문에 컴파일러가 type이 구체화 될 것으로 예상되는 타입을 어떻게 알 수 있다고 생각하십니까? display()에 더미 유형의 인수를 제공하거나 더 나은 방법으로 이러한 모든 메소드를 클래스로 이동하여 유형 매개 변수를 전체 프로그램에 대해 단 한 번만 계산할 수 있습니다. 여기

1

커플의 문제는, 적어도 :

먼저, 템플릿 함수 정의 :

template<class type> 
void display() 
{ 
    one<type> *temp=new one; 
    temp=head; 
    cout<<"\n\n"<<endl; 
    while(temp!=NULL) 
    { 
     cout<<" "<<temp->data<<" "<<"->"; 
     temp=temp->next; 
    } 
    cout<<"\n\n\n"; 
} 

one 완전한 형태가 아니기 때문에이 라인은, 형식이 잘못되었습니다 (one 클래스 템플릿입니다)

one<type> *temp=new one; 

는이 작업을 수행해야합니다

컴파일러의 유형을 추론 할 수

display(); 

그러나 display는 인수가없는 함수 템플릿, 그래서 방법이 없습니다 :

one<type> *temp=new one<type>; 

그런 다음 클라이언트 코드에서 아래로,이 같은 함수 템플릿을 호출하려고 시도 템플릿 매개 변수 type입니다. 호출 지점에서 유형을 type으로 지정해야합니다.

display<int>(); 

display() 구현시 논리 오류가 있습니다. one의 단일 복사본을 인스턴스화하고 초기화하지 마십시오. 그런 다음 링크 된 목록처럼 반복을 시도하지만 그렇지 않습니다. 방금 만든 일부 초기화되지 않은 노드입니다. 반복을 시도하는 연결 목록을 전달하려고합니다. 이 라인을 따라 뭔가 :

template<class type> 
void display(const one<type>& head) 
{ 
    one<type> const * temp = &head; 
    cout<<"\n\n"<<endl; 
    while(temp!=NULL) 
    { 
     cout<<" "<<temp->data<<" "<<"->"; 
     temp=temp->next; 
    } 
    cout<<"\n\n\n"; 
} 

는 이제 display 템플릿에 언급 된 매개 변수를, 컴파일러는 유형을 추론 할 수있다. 당신은 아마 다음과 같이 호출 할 :

display(head); 
0

one<type>* node = new one<type>;one *node = new one;를 교체하고 고정 display<int>();main()의 모든 컴파일러 오류를 display();을 변경.