2011-08-01 6 views
2

이 프로그램은 Period::display()value->getSmall을 실행할 때 잘되지만 오류를 컴파일합니다. 저는 g ++로 리눅스에서 일하고 있습니다. T으로 사용할 수있는 모든 클래스에 대해 getSmall 함수를 제공했습니다. 그냥 디버그 라인을 추가하고 segfault가 값의 유형 즉 T이 Class * 일 때 발생한다는 것을 알았습니다. 템플리트 화 된 컨텍스트에서 독립적 인 값을 호출하는 것과 같은 몇 가지 문제점을 언급 한 몇 가지 FAQ를 보았습니다. 그러나이를 해결하는 방법은 알 수 없습니다.템플릿 멤버의 멤버 함수 호출

using namespace std; 
template <class T> //T is the class which has to be related & referenced to by period 
class Period 
{ 
    T value;  
public: 

    void display() 
    { 
      cout<<setw(5)<<"| "<< value->getSmall() << "|"; 

       size_t len; //for debug 
       int s;  //for debug 
       char* p=abi::__cxa_demangle(typeid(value).name(), 0, &len, &s); //for debug 
       cout<<setw(5)<<"| "<< p << "|";  //for debug 
    } 

}; 


class Class 
{ 
    string name; 
    timeTable<Teacher*> tt; //class timetable contains pointers to teachers 
    vector<Teacher::teachTimePerClass> teachers; //set of all teachers teaching in a Class with corresponding total time 

    //assigns a teacher to a period in a day 
    bool assign(dayNames day,int periodNum,Teacher *teacher) 
    { 
     tt.assign(day,periodNum,teacher);  //assign the value in this Class's timetable 
     teacher->assign(day,periodNum,this); //update the teacher's timeTable 
    } 

public: 
     static vector<Class*> Classes; //dont forget to destory it at the end!! 


    string getSmall() 
    { 
     return name; 
    } 
}; 
vector<Class*> Class::Classes; 
+0

1. 왜 포인터를 사용하고 있습니까? 2. segfaults 코드는 어디에 있습니까? –

+0

현재 왜 display()가 segfault를해야하는지 알 수 없습니다. 컴파일러가 이것에 대해 경고해야합니다. – pmr

+0

@Cat Plus Plus 1) 많은 클래스의 기본 목록이 벡터로 유지됩니다. 이 기간은 특정 클래스에 '연결'되어 있으므로 포인터를 사용할 수도 있습니다. 대신에 무엇을 권하고 싶습니까? 2) value-> getSmall() 부분을 주석 처리하면 segfault가 발생하지 않습니다. –

답변

4

T을 포인터로 가정하지만 Period에는 절대로 값을 지정하지 마십시오.

이렇게하면 세그 폴트 할 가능성이있는 초기화되지 않은 포인터가 있습니다.

+0

불의 눈! 데이터를 채우는 할당 함수 중 하나를 완료하는 것을 잊었습니다. –

0
string getSmall() // Class::getSmall() 
{ 
    //return name; 
} 

이, 당신의 return 문이없는 것보다 실제 코드 인 경우; 이것은 정의되지 않은 동작입니다. 운좋게도 세분화 오류가 발생했습니다. 이런 종류의 버그는 추적하기가 어렵습니다. g++으로 컴파일하는 동안 -Wall 옵션을 제공해야합니다. 그것은 경고와 같은 종류의 논리 오류를 제안 할 것입니다. See demo.

+0

죄송합니다. 문제의 원인이되는 반환 값인지 확인했습니다. –

관련 문제