我现在看了c++编程艺术,看到写垃圾回收器中,在GCPtr中定义一个静态的list,该list中的成员是GCInfo<T>类型,GCInfo也是一个自定义模板类,代码如下:
template <class T, int size = 0> class GCPtr{
//包含全部指针变量
static list<GCInfo<T> > gclist;
T *addr;
bool isArray;
unsigned arraySize;
static bool first;
。。。。
};
我用的vs2008,现在的问题是,在GCPtr中为什么不能用gclist调用list的方法呢,而如果把gclist定义到一个模板函数中,就可以调用了
template <class T>
void fun(const &T x)
{
list <GCInfo<T> > gclist;
}
我也是按着书上来的,这是什么原因呢
c++在模板类中使用list问题
答案:4 悬赏:0 手机版
解决时间 2021-03-10 00:22
- 提问者网友:温旧梦泪无声
- 2021-03-09 16:11
最佳答案
- 五星知识达人网友:底特律间谍
- 2021-03-09 17:37
给你一个简化的,能正确编译、链接的修改,楼主对照着看看是不是漏了什么,没有注释:
template<typename T>
class GCInfo{};
template <class T, int size = 0>
struct GCPtr{
static list<GCInfo<T> > gclist;
void Test()
{
gclist.push_back(GCInfo<T>());
}
};
list<GCInfo<int> > GCPtr<int, 1>::gclist;
void TestTheModel()
{
GCPtr<int, 1> t;
t.Test();
}
template<typename T>
class GCInfo{};
template <class T, int size = 0>
struct GCPtr{
static list<GCInfo<T> > gclist;
void Test()
{
gclist.push_back(GCInfo<T>());
}
};
list<GCInfo<int> > GCPtr<int, 1>::gclist;
void TestTheModel()
{
GCPtr<int, 1> t;
t.Test();
}
全部回答
- 1楼网友:鸽屿
- 2021-03-09 19:49
可以调用但需要注意几个问题。
1、静态对象必须在类外初始化。
2、因有在类外初始化的需求,静态对象必须是公有的。
下面看个例子:
linklist<int> list2;
class A
{
public:
static linklist<int> list;
void mod()
{
list.add(10);
}
void print()
{
list.print();
}
};
linklist<int> A::list=list2;
int main()
{
A a;
a.mod();
a.print();
system("pause");
}
以上例子给你描述的大致差不多,你对照看看你的问题在那。
- 2楼网友:街头电车
- 2021-03-09 19:29
static list<GCInfo<T> > gclist;
表明gclist是静态成员,所以只有静态成员函数才可以操作gclist
不知道是不是这个原因
- 3楼网友:酒醒三更
- 2021-03-09 18:36
给你一个简化的,能正确编译、链接的修改,楼主对照着看看是不是漏了什么,没有注释:
template<typename t>
class gcinfo{};
template <class t, int size = 0>
struct gcptr{
static list<gcinfo<t> > gclist;
void test()
{
gclist.push_back(gcinfo<t>());
}
};
list<gcinfo<int> > gcptr<int, 1>::gclist;
void testthemodel()
{
gcptr<int, 1> t;
t.test();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯