我在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
的同一个函数中没有被新增,并且已被推入队列!
答案 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。