我刚刚开始使用模板,而且我是否在子类中调用模板函数实际上是合法的。我的问题是在下面的代码中的模板函数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;
};
这就是它被称为
的地方 //how the function is being called
void Map::Brush(SPRITE *newSprite, POINT MousePosition)
{
Grid::ChangeSprite<MapTile>(newSprite,mapTilew,mapTileh);
}
答案 0 :(得分:1)
只要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
}
}
};
您的问题可能在于您正在使用的不同文件,例如模板化函数应该在头文件中定义,在类定义中或下面。