c++在模板类中使用list问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++在模板类中使用list问题相关的知识,希望对你有一定的参考价值。
我现在看了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;
我也是按着书上来的,这是什么原因呢
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");
以上例子给你描述的大致差不多,你对照看看你的问题在那。 参考技术B 给你一个简化的,能正确编译、链接的修改,楼主对照着看看是不是漏了什么,没有注释:
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();
本回答被提问者采纳 参考技术C static list<GCInfo<T> > gclist;
表明gclist是静态成员,所以只有静态成员函数才可以操作gclist
不知道是不是这个原因
c ++:使用模板在类中定义可变长度数组
【中文标题】c ++:使用模板在类中定义可变长度数组【英文标题】:c++: defining variable-length array within a class using templates 【发布时间】:2014-01-31 04:01:05 【问题描述】:我正在尝试构建一个 MapV2 类。在课堂上,我希望有一个 Cell 对象数组作为私有成员(Cell 是另一个类)。我正在尝试获取它,以便地图的大小由与构造函数一起使用的模板参数分配。即,我正在尝试获得类似于以下内容的内容:
const size_t arraySize = 12;
MapV2<arraySize> myMapV2;
这是我的文件 Map.h:
#pragma once
#include <iostream>
#include "Cell.h"
template<size_t M, size_t N>
class MapV2
public:
MapV2();
~MapV2();
private:
Cell myMapV2[M*N];
;
这里是 Map.cpp:
#include <iostream>
#include "MapV2.h"
MapV2<size_t M, size_t N>::MapV2()
MapV2::~MapV2()
这里是主要功能:
int main()
const size_t xLength = 6;
const size_t yLength = 8;
MapV2 <xLength, yLength> Example;
return 0;
但是当我尝试编译时,我得到以下一团糟的错误:
Compiling: MapV2.cpp
D:\Users\Vik\ModSim1a\MapV2.cpp:4: error: wrong number of template arguments (1, should be 2)
D:\Users\Vik\ModSim1a\MapV2.h:7: error: provided for 'template<unsigned int M, unsigned int N> class MapV2'
D:\Users\Vik\ModSim1a\MapV2.cpp: In function 'int MapV2()':
D:\Users\Vik\ModSim1a\MapV2.cpp:4: error: 'int MapV2()' redeclared as different kind of symbol
D:\Users\Vik\ModSim1a\MapV2.h:7: error: previous declaration of 'template<unsigned int M, unsigned int N> class MapV2'
D:\Users\Vik\ModSim1a\MapV2.cpp:7: warning: no return statement in function returning non-void
D:\Users\Vik\ModSim1a\MapV2.cpp: At global scope:
D:\Users\Vik\ModSim1a\MapV2.cpp:9: error: expected constructor, destructor, or type conversion before '::' token
Process terminated with status 1 (0 minutes, 0 seconds)
5 errors, 1 warnings
我已经用谷歌搜索过这个问题,并花了一些时间尝试遵循类似 *** 帖子中给出的建议,但是没有一个示例说明在代码中为实际构造函数(即 MapV2.cpp 文件)做什么来获取这工作。我觉得这些错误很容易解决。非常感谢任何帮助。
【问题讨论】:
【参考方案1】:请参阅Why can templates only be implemented in the header file? 了解更多信息。如果您尝试使用显式实例化来缓解问题,您的模板参数是非类型的,因此它们必须如下所示:
template class MapV2<6, 8>; //et. all for all possible number combinations
如果你试试这个:
template class MapV2<size_t, size_t>;
// or this, replace unsigned long int with what size_t is on your system
template class MapV2<unsigned long int, unsigned long int>;
你会得到这个令人难以置信的错误:
error: expected a constant of type ‘long unsigned int’, got ‘long unsigned int’
这是因为它需要一个 long unsigned int 而不是 类型。
您可以看到为什么这会是一个问题。我会将构造函数的定义移到标题中以避免头痛。
struct Cell ;
template<size_t M, size_t N>
class MapV2
public:
// Declaration
MapV2();
~MapV2();
private:
Cell myMapV2[M*N];
;
// Definition
template<size_t M, size_t N>
MapV2<M, N>::MapV2()
template<size_t M, size_t N>
MapV2<M, N>::~MapV2()
【讨论】:
在尝试您的代码之后,现在出现两个错误:D:/Users/Vik/ModSim1a/ModSim1a.cpp:18: undefined reference to MapV2<6u, 8u>::MapV2()' D:/Users/Vik/ModSim1a/ModSim1a.cpp:19: undefined reference to MapV2<6u, 8u>::~MapV2()'
@user2826735 这些是链接器错误。我认为您已将模板定义保留在标头中(您不能将其放在 cpp 文件中。)我还试图查看如何显式实例化它,但 size_t 会导致问题。
我可以将其更改为int
或unsigned
。
@user2826735 嗯,我只是觉得你需要将模板的定义移到标题中。
我该怎么做呢?标题中不是已经有一个吗?以上是关于c++在模板类中使用list问题的主要内容,如果未能解决你的问题,请参考以下文章