调用模板成员的成员函数

时间:2011-08-01 12:15:18

标签: c++ templates

value->getSmall中运行Period::display()时,此程序可编译精细但seg错误。我正在使用g ++开发linux。我为所有可用作getSmall的类提供了T函数。为了确保我添加了调试行,发现当值类型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;

2 个答案:

答案 0 :(得分:4)

您假设T是指针,但永远不会在Period中给它一个值。

这样你就有了一个可能会出现段错误的未初始化指针。

答案 1 :(得分:0)

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

如果这是您的真实代码,那么您的return语句将丢失;这是一种未定义的行为。幸运的是,您遇到了分段错误。这种错误很难追查。在使用-Wall进行编译时,您应该提供g++选项;它会建议像警告这样的逻辑错误。 See demo