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;

我也是按着书上来的,这是什么原因呢

参考技术A 可以调用但需要注意几个问题。
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&lt;6u, 8u&gt;::MapV2()' D:/Users/Vik/ModSim1a/ModSim1a.cpp:19: undefined reference to MapV2&lt;6u, 8u&gt;::~MapV2()' @user2826735 这些是链接器错误。我认为您已将模板定义保留在标头中(您不能将其放在 cpp 文件中。)我还试图查看如何显式实例化它,但 size_t 会导致问题。 我可以将其更改为intunsigned @user2826735 嗯,我只是觉得你需要将模板的定义移到标题中。 我该怎么做呢?标题中不是已经有一个吗?

以上是关于c++在模板类中使用list问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试在模板类中重载 / 运算符的 C++ 错误

c++中另一个类中的模板类实例化

C++ 错误在模板类中声明 std::pair

在 C++ 的孙子类中覆盖模板参数?

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

C++模板类中的成员函数以及模板函数在类外定义的方式