Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将基类';子类中的模板函数?_C++_Function_Templates_Base - Fatal编程技术网

C++ 将基类';子类中的模板函数?

C++ 将基类';子类中的模板函数?,c++,function,templates,base,C++,Function,Templates,Base,可能重复: 我刚刚开始使用模板,我想知道在子类中调用模板函数是否合法。我的问题是下面代码中的模板函数ChangeSprite。正在子类中调用它,但这会创建链接错误。如果我删除模板部分,只给它一个我计划使用它的多个东西,它会工作得很好,所以我担心我无法做到这一点 //base class #pragma once #include "Tile.h" #include <list> #include "Sprite.h" #include "WindowCreater.h" #in

可能重复:

我刚刚开始使用模板,我想知道在子类中调用模板函数是否合法。我的问题是下面代码中的模板函数ChangeSprite。正在子类中调用它,但这会创建链接错误。如果我删除模板部分,只给它一个我计划使用它的多个东西,它会工作得很好,所以我担心我无法做到这一点

//base class
#pragma once  
#include "Tile.h"
#include <list>
#include "Sprite.h"
#include "WindowCreater.h"
#include "Directx.h"  
#define LeftClickParameters WindowCreator *gw, Mouse* mouse
struct Grid
{

    SPRITE *sprite;
    int width, hieght;
    int w, h;
    int x, y;
    Grid(int width, int hieght,SPRITE *sprites);
    list<Tile> tilew;
    list<list<Tile>> tileh;

    //methods

    void savefile();
    void openfile();
    virtual void MoveLeft() = 0;
    virtual void MoveRight() = 0;
    virtual void MoveUp() = 0;
    virtual void MoveDown() = 0;
    virtual void addrow() = 0;
    virtual void deleterow() = 0;
    virtual void addcolumb() = 0;
    virtual void deletecolumb() = 0;

    //template functions
    template <class T> void ChangeSprite(SPRITE *newSprite,list<T> tilew,list<list<T>> tileh);

    // Virtual methods
    virtual list<Tile> ReadTiles() = 0;
};    
//基类
#布拉格语一次
#包括“Tile.h”
#包括
#包括“Sprite.h”
#包括“WindowCreater.h”
#包括“Directx.h”
#定义LeftClickParameters WindowCreator*gw,鼠标*鼠标
结构网格
{
雪碧*雪碧;
内部宽度,高度;
int w,h;
int x,y;
栅格(整数宽度、整数高度、精灵*精灵);
列表tilew;
罗列提莱;
//方法
void savefile();
void openfile();
虚空MoveLeft()=0;
虚拟void MoveRight()=0;
虚拟void MoveUp()=0;
虚拟void MoveDown()=0;
虚拟void addrow()=0;
虚拟void deleterow()=0;
虚空addcolumb()=0;
虚空deletecolumb()=0;
//模板函数
模板void ChangeSprite(SPRITE*newSprite、列表tilew、列表tileh);
//虚拟方法
虚拟列表ReadTiles()=0;
};    
这就是它被称为的地方

 //how the function is being called
 void Map::Brush(SPRITE *newSprite, POINT MousePosition)
 {
  Grid::ChangeSprite<MapTile>(newSprite,mapTilew,mapTileh);
 }
//函数的调用方式
虚空贴图::画笔(精灵*newSprite,鼠标点位置)
{
网格::ChangeSprite(newSprite、mapTilew、mapTileh);
}

只要
Map
Grid
继承,它就可以,否则,您必须使
ChangeSprite
静态,或者给它一个
Map
对象来操作。下面是一个孩子调用父模板函数的有效示例

struct Grid {
  template <class T> void ChangeSprite(/*params here*/) {
    // code here
  }
};

struct Map : public Grid {
    void Brush() {
        // bool being a placeholder for MapTile
        Grid::ChangeSprite<bool>(/*params here*/) {
            // code here
        }
    }
};
结构网格{ 模板void ChangeSprite(/*此处为参数*/){ //代码在这里 } }; 结构图:公共网格{ 空刷(){ //布尔是MapTile的占位符 网格::ChangeSprite(/*参数在这里*/){ //代码在这里 } } };
您的问题可能在于您正在使用的不同文件,例如,模板化函数应该在头文件中、类定义中或类定义下定义。

该函数的定义在哪里?为什么您的ChangeSprite函数首先需要是模板?