所以我正在努力将一个库从 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;
}
以下是错误
error: expected unqualified-id before '[' token
error: invalid use of template-name 'DataGrid' without argument list
error: 'T' does not name a type
error: 'template class DataGrid' used without template parameters
最佳答案
在类模板定义之外定义类模板的成员函数时,需要使用如下语法:
template <typename T> // Need this
DataGrid<T>::DataGrid(int w, int h) { ... }
// ^^^ Need this also.
和
template <typename T>
DataGrid<T>::~DataGrid() { ... }
关于c++ - 我的模板语法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34073170/