所以我正在努力将一个库从C#/ XNA移植到C ++ / SDL,而且我对C ++缺乏经验。我正在尝试重写一些通用数据容器,但我得到了模板语法的奇怪错误。我看了很多例子,但我似乎无法看到我做错了什么。
我在Code Blocks IDE中工作。这是我的代码和代码块给我的错误消息。它似乎无法识别模板名称应该是什么。
template <typename T>
class DataGrid
{
private:
int width;
int height;
T[ , ] data;
public:
DataGrid(int, int);
~DataGrid();
void setData(int, int, T);
T getData(int, int);
bool inDomain(int, int);
bool isValidPoint(int, int);
void formatBoard(int, int);
};
#include "DataGrid.h"
//template <typename T>
DataGrid::DataGrid(int w, int h)
{
width = w;
height = h;
data = new T[width, height];
for (int i = 0; i < width; i++)
{
for (int k = 0; k < height; k++)
{
data[i, k] = default(T);
}
}
}
//template <typename T>
DataGrid::~DataGrid()
{
for (int i = 0; i < width; i++)
{
for (int k = 0; k < height; k++)
{
delete data[i, k];
}
}
delete data;
}
//template <typename T>
T DataGrid::getData(int x, int y)
{
if (inDomain(x, y))
{
return data[x, y];
}
}
template <typename T>
void DataGrid::setData(int x, int y, T &nData)
{
if (inDomain(x, y))
{
data[x, y] = nData;
}
}
//template <typename T>
bool DataGrid::inDomain(int x, int y)
{
if (x >= 0 && x < width)
{
if (y >= 0 && height)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
return false;
}
//template <typename T>
bool DataGrid::isValidPoint(int x, int y)
{
if (inDomain(x, y))
{
if (data[x, y] != default(T))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
return false;
}
//template <typename T>
void DataGrid::formatBoard(int width, int height)
{
for (int i = 0; i < width; i++)
{
for (int k = 0; k < height; k++)
{
delete data[i, k];
}
}
delete data;
this->width = width;
this->height = height;
for (int i = 0; i < width; i++)
{
for (int k = 0; k < height; k++)
{
data[i, k] = default(T);
}
}
}
//template <typename T>
int DataGrid::getWidth()
{
return width;
}
//template <typename T>
int DataGrid::getHeight()
{
return height;
}
以下是错误
错误:在'['标记
之前预期的unqualified-id错误:无参数列表
无效使用模板名称'DataGrid'错误:'T'没有命名类型
错误:'模板类DataGrid'没有模板参数使用
答案 0 :(得分:1)
在类模板定义之外定义类模板的成员函数时,需要使用以下语法:
template <typename T> // Need this
DataGrid<T>::DataGrid(int w, int h) { ... }
// ^^^ Need this also.
和
template <typename T>
DataGrid<T>::~DataGrid() { ... }