Почему тип не является безопасным в классе шаблона? - PullRequest
0 голосов
/ 06 ноября 2011

Я столкнулся со странной ошибкой, связанной с классом шаблона в C ++.Коды работают нормально большую часть времени, но в одном случае это не удалось.Ниже приведены упрощенные коды:

template <class T>
class Class1
{
    ...
    T *func();
    ...
};

// ---------------------------------------------------------------

template <class T>
T *Class1<T>::func(...)
{
    ...
    string name = typeid(T).name();
    T *ptr = a_queue.front(); // a_queue is of type "queue<T *>"
    ptr->some_func(); // failed
    ...
}

// ---------------------------------------------------------------

Class1<Class2> class1;
class1.func();

Предположим, Class1 специализируется с T, равным Class2 и Class3 соответственно.В Class1<Class2>::func, ptr объявляется как указатель Class3 в этом случае!Таким образом, тип не является безопасным в классе шаблона?

Есть идеи?Спасибо!

Редактировать:

Я добавил string name = typeid(T).name(), тогда T будет правильного типа (Class2), но при вызове функции-члена some_func из Class2, есть ошибка:

cannot access memory address at 0x10

[решено] Окончательное редактирование 2011/11/09:

Я обнаружил проблему, это не таксвязан с классом шаблона, но вызван удалением неправильного указателя, который не обновляется в той же функции с delete и был помещен в очередь!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

не может получить доступ к адресу памяти в 0x10

, что эквивалентно ссылке на нулевой указатель.Компилятор начал с некоторого T *ptr = 0 и попытался найти элемент (или vtable) T со смещением 0x10, поэтому он посмотрел на память 0 + 0x10.Так что я думаю, что ваша проблема не в типах шаблонов, а в a_queue.front(), содержащем NULL.

0 голосов
/ 06 ноября 2011

У вашего вопроса есть шаблон функция .Вы шаблонировали и класс и функцию?

template <typename T>
class Class1
{
    template <typename U>
    U *::func(... some argument of U...)
};

Это позволило бы вам вызвать Class1<Class2>::func(...some arg Class3...) и получить func<Class3> внутри Class1<Class2>.

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