c ++:使用模板在类中定义可变长度数组
Posted
技术标签:
【中文标题】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 ++:使用模板在类中定义可变长度数组的主要内容,如果未能解决你的问题,请参考以下文章