c++ - 我的模板语法有什么问题?

标签 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;
}

以下是错误

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/

相关文章:

templates - 在Liquid模板中输出文字大括号

c++ - 在回溯中格式化 GDB 模板参数

c++ - 对 C++ 中的基本递归感到困惑

c++ - 是否可以像在 Matlab 中那样在 C++ 中初始化 vector ?

c++ - SSE g++ 编译问题

c# - 如何使用 C# 拦截 Win32 API 调用?

python - Django 从模型变量渲染模板

java - 在 Android studio 中使用 Activity 模板时无法添加新的 Java 类吗?

c++ - C++ 中通用项目的容器需要帮助

c++ - 如何使用按位运算符提取整数中的数字