为什么类型在模板类中不安全?

时间:2011-11-06 05:21:31

标签: c++ templates pointers

我在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分别为Class2Class3。在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 :(得分:0)

您的问题有一个模板功能。您是否 函数?

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

这样您就可以在Class1<Class2>::func(...some arg Class3...)内拨打func<Class3>并获取Class1<Class2>

答案 1 :(得分:0)

  

无法访问0x10的内存地址

这相当于NULL指针引用。编译器以一些T *ptr = 0开始,并试图在偏移量0x10处找到T的成员(或vtable),因此它查看了内存0 + 0x10。所以我认为你的问题不是模板类型问题,而是a_queue.front()包含NULL。