Вызов функции-члена шаблонного члена - PullRequest
2 голосов
/ 01 августа 2011

Эта программа компилируется нормально, но при обнаружении ошибок value->getSmall в Period::display() происходит сбой. Я работаю над Linux с G ++. Я предоставил функцию getSmall для всех классов, которые могут использоваться как T. Просто чтобы быть уверенным, что я добавил строки отладки и обнаружил, что ошибка возникает, когда тип значения, то есть T - это Class *. Я сталкивался с некоторыми часто задаваемыми вопросами, в которых упоминались некоторые проблемы, такие как вызов независимых значений в шаблонном контексте, но я не знаю, как решить эту проблему.

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 ]

4 голосов
/ 01 августа 2011

Вы принимаете T как указатель, но никогда не присваиваете ему значение в Period.

Таким образом, у вас есть неинициализированный указатель, который может стать причиной ошибки.

0 голосов
/ 01 августа 2011
string getSmall()  // Class::getSmall()
{
  //return name;
}

Если это ваш реальный код, значит, ваш оператор return отсутствует;который является неопределенным поведением.К счастью, вы получаете ошибку сегментации.Этот вид ошибок трудно отследить.Вы должны предоставить опцию -Wall при компиляции с g++;это предложит такие логические ошибки как предупреждения. См. Демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...