在子类中调用基类的模板函数是否合法?

时间:2012-01-29 23:24:05

标签: c++ function templates base

  

可能重复:
  “Undefined reference to” template class constructor

我刚刚开始使用模板,而且我是否在子类中调用模板函数实际上是合法的。我的问题是在下面的代码中的模板函数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);
 }

1 个答案:

答案 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
        }
    }
};

您的问题可能在于您正在使用的不同文件,例如模板化函数应该在头文件中定义,在类定义中或下面。