【问题标题】:What am I doing wrong with my template syntax?我的模板语法做错了什么?
【发布时间】:2016-03-08 11:46:15
【问题描述】:

所以我正在将一个库从 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”在没有模板参数的情况下使用

【问题讨论】:

  • T[ , ] data 不是有效的 C++ 代码。
  • 顺便说一句,您的测试功能过于复杂。它们可以大大简化。例如bool DataGrid::inDomain(int x, int y) { return x &gt;= 0 &amp;&amp; x &lt; width &amp;&amp; y &gt;= 0 &amp;&amp; y &lt; height; }

标签: c++ templates


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2022-11-18
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多