我的模板语法出错了什么?

时间:2015-12-03 18:07:46

标签: c++ templates

所以我正在努力将一个库从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'没有模板参数使用

1 个答案:

答案 0 :(得分:1)

在类模板定义之外定义类模板的成员函数时,需要使用以下语法:

template <typename T> // Need this
DataGrid<T>::DataGrid(int w, int h) { ... }
    //  ^^^ Need this also.

template <typename T>
DataGrid<T>::~DataGrid() { ... }